home *** CD-ROM | disk | FTP | other *** search
/ Ultimate Blitz Basic 2.1 / Ultimate Blitz Basic 2.1 (1997)(Acid Software).iso / blitz2_manual next >
Text File  |  1997-10-13  |  484KB  |  13,801 lines

  1. WELCOME
  2.  
  3. Thank you for purchasing Blitz Basic 2.1 We at Acid Software hope that it
  4. provides you with an environment, that gives you the total freedom you need 
  5. to explore your ideas on the Amiga computer.
  6.  
  7. Blitz Basic 2.1 gives you the power to make commercial quality games such as
  8. Super Skidmarks or BlitzBombers and the flexibility to create applications 
  9. such as paint packages and spreadsheets.
  10.  
  11. WHAT YOU SHOULD HAVE RECEIVED
  12.  
  13. PROGRAM DISK
  14.  
  15. This disk is installed with a limited Workbench 1.3 environment so that 
  16. floppy disk users can boot straight from this disk. It contains six main
  17. files:
  18.  
  19. Acidlibs        The standard Blitz2 commands.
  20. Blitz2            The compiler
  21. Deflibs            The additional commands created from third party 
  22.             libraries.
  23. Help            The on-line help program.
  24. Help.dat        The data file for the on-line help program.
  25. Ted            The editor.
  26.  
  27. EXAMPLES DISK
  28.  
  29. This disk is full of demos and examples written in BlitzBasic 2.1 They 
  30. provide a wealth of information for Blitz Basic 2.1 programmers to advance 
  31. their skills. The examples have been placed into seven separate directories:
  32.  
  33. Amigamode:-    Applications related examples on gadgets, windows,
  34.         arexx, etc.
  35. AndrewsDemos:-    Games/graphics related examples by Andrew Blackbourne.
  36. Blitzmode:-    Game/graphics related examples on scrolling, blitting,
  37.         animation, etc.
  38. MarksDemos:-    Applications related examples by Mark Sibly.
  39. SimonsDemos:-    Games related examples by Simon Armstrong.
  40. TedsDemos:-    Demo/graphics related examples by Ted Bailey.
  41. Tools:-        Application and games related tools and source code.
  42.  
  43. A
  44.  
  45.  
  46. EXTRAS DISK
  47.  
  48. This disk is full of additional utilities and programs for users with more 
  49. than 1 Mb of memory and a hard drive. To squeeze as much as possible onto 
  50. the disk, the files have been compressed using an 'archiver' called Lha. 
  51. The evaluation version of this program is required so that you can unpack 
  52. the files. This disk contains five archives:
  53.  
  54. BigDeflibs.lha:-    All the amigalibs and third party libraries compiled into
  55.             one file.
  56. Blitzlibs.lha:-        All the object code for amigalibs and the third party
  57.             libraries and the Blitz resident files and utilities.
  58. LibsDev.lha:-        An archive for advanced users wanting to create their
  59.             own libraries. It contains documentation, example
  60.             library source code and test example code for the 
  61.             third party libraries.
  62. NewDebugger.lha:-    An advanced debugging utility that allows you to 
  63.             view copperlists, memory etc.
  64. NewTeditor.lha:-    An Amiga style guide compliant editor that requires
  65.             Workbench 2.0 or greater.
  66.  
  67.     MANUAL
  68.  
  69. This manual contains detailed descriptions of all the standard commands 
  70. found in Acidlibs. It also contains some helpful examples and hints on how 
  71. to get the best performance from Blitz.
  72.  
  73. REGISTRATION CARD
  74.  
  75. Please fill out this card and mail it back to your Acid Software 
  76. Distribution Centre. Once we have received your card, you will be allocated 
  77. a Blitz User number, please quote it in all subsequent communications. You 
  78. will not be eligible for any support, bug fixes and updates without 
  79. registering yourself as a Blitz Basic 2.1 user.
  80.  
  81. B
  82.  
  83.  
  84. INSTALLING BLITZ
  85.  
  86. NB: Please make backup copies of all your disks before using Blitz.
  87.  
  88. Floppy disk users
  89.  
  90. You can start using Blitz Basic 2.1 straight away. Insert the program disk 
  91. and switch on your Amiga. Double-click on the Blitz2 icon and after a short 
  92. pause an 'okee dokee' requester will appear. Click on this and you are now 
  93. ready to start. Please refer to chapter one 'Getting Started' for 
  94. instructions on how to load the examples.
  95.  
  96. Hard disk users
  97.  
  98. 1.     Create a new directory on your hard disk. Blitz is a good name to
  99.     choose.
  100.  
  101. 2.     Copy the following files from your Blitz Program floppy disk into 
  102.     the new directory on your hard disk:
  103.                 acidlibs
  104.                 Blitz2
  105.                 Blitz2.info
  106.                 deflibs
  107.                 help
  108.                 help.dat
  109.                 Ted
  110.                 Ted.info
  111.  
  112. 3.     Create two new sub-directories in your blitz directory:
  113.                 Blitzlibs
  114.                 Userlibs
  115.  
  116. 4.     Add the following two assigns to your start-up sequence:
  117.  
  118.         Assign Blitz2: <hard drive>:<new directory>
  119.         Assign Blitzlibs: <hard drive>:<new directory>/<new 
  120.         sub-directory>
  121.  
  122.         e.g: Assign Blitz2: DH1 :Blitz
  123.         Assign Blitzlibs: DH1 :Blitz/Blitzlibs
  124.  
  125. 5. Restart your Amiga and you are ready to run Blitz from your hard disk
  126.  
  127. C
  128.  
  129.  
  130. INSTALLING THE ADDITIONAL UTILITIES AND EXTRAS
  131.  
  132. You do not need to install the additional utilities and extras in order to 
  133. use Blitz.
  134. You can simply boot from your Blitz Program disk and start writing your 
  135. programs.
  136. The extras disk is provided for users with more memory and hard disk drives 
  137. and for the more advanced programmers out there.
  138.  
  139. All the additional files will need to be un-archived before they can be 
  140. installed or used. In order to do this you will need the evaluation version 
  141. of Lha by Stefan Boberg, which unfortunately wouldn't fit on the disk. It 
  142. is available from most Public Domain software suppliers, Aminet and most 
  143. magazine coverdisks.
  144.  
  145. One way to extract the files from the archives once you have the Lha 
  146. program, is:
  147.  
  148. 1. Load up Workbench.
  149.  
  150. 2. Copy the Lha program file into your Workbench:C drawer.
  151.  
  152. 3. Open a shell by double-clicking on the shell icon in the system drawer.
  153.  
  154. 4. Type: Lha x
  155.     e.g: Lha x Extras:BigDeflibs.lha Ram:
  156.  
  157. 5. Copy the un-archived file into its correct place
  158.     e.g: copy deflibs DH1 :Blitz
  159.  
  160. D
  161.  
  162.  
  163. What's in the archives and where do the files go?
  164.  
  165. BigDeflibs.lha:  
  166.  
  167. This contains a single 1 59K deflibs file that is a  direct
  168. replacement  for  the small 55K deflibs file in your Blitz  drawer.   Floppy
  169. disk  users  do not have enough room on their program disk to  install  this
  170. file.
  171.  
  172. Blitzlibs.lha:  
  173.  
  174. This contains two directories and several resident files and
  175. utilities.   Floppy  disk users should format a blank  disk  and  rename  it
  176. Blitzlibs  and  then un-archive the file onto this disk.   Hard  disk  users
  177. should  un-archive  this file into the Blitzlibs drawer  they  created  when
  178. installing Blitz.
  179.  
  180. LibsDev.lha:  
  181.  
  182. This contains six directories and a documentation file. Floppy
  183. disk  users  should format a blank disk and un-archive the  file  onto  this
  184. disk.   Hard  disk users should create a new sub-directory  in  their  Blitz
  185. drawer (a good name would be developers)  and then un-archive this file into
  186. the new directory.
  187.  
  188. NewDebugger.lha:   
  189.  
  190. This   contains   the   new   1   52K  defaultdbug  file,
  191. documentation on its use and an example directory containing test  programs.
  192. The  file  is  a  direct replacement for the small 33K defaultdbug  in  your
  193. Blitz  drawer.   The  examples and documentation can  be  installed  in  any
  194. suitable directory.  Floppy disk users will not be able to install this file
  195. as there is not enough room on their program disk.  NB: The big 159K deflibs
  196. file must be installed to use the advanced debugging utility.
  197.  
  198. NewEditor.lha:        
  199.  
  200. This  contains the new 57K Ted file and some documentation on its use.   The
  201. file is a direct replacement for the 59K Ted file in your Blitz drawer.  The
  202. documentation can be installed in any suitable directory.  Floppy disk users
  203. will  not  be  able  to  install this file and the additional  libraries  it
  204. requires  as there is not enough room on their program disk.  NB:   The  new
  205. editor requires Workbench 2.0 or greater.
  206.  
  207. E
  208.  
  209.  
  210. Directory Tree for Hard Disk users
  211.  
  212. DH1:-Blitz ------------------------------------------program files
  213.          |
  214.     |
  215.      --------- Blitzlibs --------------------------- resident files
  216.     |               |
  217.     |           |    
  218.     |        |--- amigalibs        amiga libraries
  219.     |         --- otherlibs        third party libraries
  220.     |
  221.      ---- Developers----------------------------- documentation
  222.     |    |
  223.     |    |
  224.     |    |---  acidlibsrc     acid library source code
  225.     |    |---  amigaincludes     system includes
  226.     |    |---  toolsource     developer toolsource code
  227.     |    |---  userlibdocs     does for third party fibs
  228.     |    |---  userlibprogs     test programs for third party fibs
  229.     |     ---  Userlibsource     source code for third party fibs
  230.     |
  231.     |--- Examples
  232.     |    |
  233.     |    |---  amigamode
  234.     |    |---  andrewsdemos
  235.     |    |---  blitzmode
  236.     |    |---  marksdemos        ;example code                
  237.     |    |---  simonsdemos
  238.     |    |---  tedsdemos
  239.     |     ---  tools
  240.     |
  241.     |
  242.     |
  243.     |
  244.      --- Userlibs
  245.  
  246. NB:   The  developers and examples directories are optional.   Blitzlibs  is
  247. mainly required for the resident files that some programs use.  Userlibs  is
  248. only required for testing beta-versions of your own libraries.
  249.  
  250. F
  251.  
  252.  
  253. BUM SUBSCRIPTIONS AND SUPPORT
  254.  
  255. If you want to receive the latest additions, fixes and example code, you can
  256. subscribe  to  the  Blitz User Magazine currently at issue  eight.   We  are
  257. hoping  to have BUM9 ready shortly after Christmas 1995 and it will  consist
  258. of  two  disks  that will unpack onto four disks (this is the  standard  BUM
  259. format).  For œ10.00,  registered users can have the next two issues of  BUM
  260. delivered to their door.  Please note, existing BUM subscribers have already
  261. paid for the next two issues.
  262.  
  263. UK and European registered users should contact:
  264.  
  265. Acid Software
  266. c/o Guildhall Leisure Services
  267. Unit 15, Guildhall Industrial Estate
  268. Kirk Sandall
  269. Doncaster
  270. DN3 1QR
  271.  
  272. Blitz Installation Support 
  273. Tel 01429 266413 Mon - Fri 9Am - 5Pm (** UK ONLY **)
  274.  
  275. EMail:- kevv@Globalnet.co.uk
  276.  
  277. US and Australasian registered users should contact:
  278.  
  279. Email: acid@iconz.co.nz
  280.  
  281. G
  282.  
  283.  
  284. PROBLEMS YOU MAY ENCOUNTER
  285.  
  286.  
  287. Error Type Explanation and Solution
  288.  
  289. Can't  compile  the program,  there are    ??????'s  instead of Blitz commands:
  290. The program may be  using  a  Blitz command from the third party libraries.
  291. you got the large deflibs installed in your Blitz drawer ? NB:  Floppy users
  292. cannot  install the large deflibs file as there isn't enough room  on  their
  293. program disk
  294.  
  295. Can't  load resident :A few programs use resident files which are  contained
  296. in  the  blitzlibs  archive.  Floppy users  have  you  named  a  blank  disk
  297. Blitzlibs un-archived the file blitzlibs.lha onto it? Hard Disk  users  have
  298. you  un-archived the blitzlibs.lha file into the correct drawer on your hard
  299. drive ? Have you added the assign for Blitzlibs: to your startup sequence ?
  300.  
  301. Please insert volume Blitzlibs:        See above explanation and is your
  302. deflibs file in the same drawer as the Blitz2 program file ?.
  303.  
  304. Can't  load  graphic/shape/sound/include Blitz can't find  the  file  to  be
  305. loaded. Have you used the Change Directory gadget on the file requester ?
  306.  
  307. H
  308.  
  309.  
  310. CONTENTS
  311.  
  312. 1. GETTING STARTED                    1
  313.  
  314. Installing Blitz                    1
  315. Registration Card                    1
  316. OkeeDokee?                        1
  317. Running the Examples                    1
  318. Current Directories                    2
  319. Using Ted the Blitz2 Editor                2
  320. Entering Text                        3    
  321. Highlighting blocks of text                3
  322. The Editor Menus                    4
  323. The Blitz File Requester                7
  324. The Compiler Menu                    8
  325. Compiler Options                    9    
  326. Keyboard Shortcuts                    10
  327.  
  328. 2. BLITZ BASIC'S                    11
  329.  
  330. My First Program                    11
  331. The Print Command                    11
  332. Formatted Printing                    12
  333. A Simple Variable                    12
  334. Blitz2 Operators                    12
  335. Boolean Operators                    14
  336. Binary Operators                    14
  337. Multiple Commands                    14
  338. A Simple Loop                        14
  339. Nested Loops                        15
  340. While..Wend and Repeat..Until                 15
  341. Endless Loops                        16
  342. Using String Variables                    16
  343. Program Flow                        17
  344. Jumpin' Around                        17
  345. Getting Input from the User                18
  346. Arrays                            19
  347.  
  348. 3. TYPES, ARRAYS AND LISTS                21
  349.  
  350. Numeric Types                        21
  351. Default Types                        22
  352. The Data Statement                    22
  353. Numeric Overflows                    23
  354. String Types                        23
  355. System Constants                    23
  356. Primitive Types Summary                    23
  357. NewTypes                        24
  358. Arrays inside NewTypes                    25
  359. The UsePath Directive                    26
  360. ARRAYS                            27
  361. LISTS                            28
  362. Dimming Lists                        28
  363. Adding items to a list                    28
  364. Processing Lists                    29
  365. Removing Items From a List                30
  366. List Structure                        30
  367. The Pointer Type                    30
  368.  
  369. 4. PROCEDURES                        31
  370.  
  371. Introduction                        31
  372. Statements                        31
  373. Functions                        32
  374. Recursion                        33
  375. Accessing Global Variables                33
  376. Procedures Summary                    33
  377. Assembler in Blitz Procedures                34
  378.  
  379. 5. ERROR CHECKING&DEBUGGING                 35
  380.  
  381. Compile Time Errors                    35
  382. The CERR Directive                    36
  383. Runtime Errors                        36
  384. The Blitz Debugger                    37
  385. The Debugger Gadgets                    38
  386. Tracing program execution                38
  387. Resuming Normal Execution                39
  388. Viewing command history                    39
  389. Direct Mode                        39
  390. Debugger Errors                        40
  391.  
  392.  
  393. 6. BLITZ OBJECTS                    41
  394.  
  395. Blitz2 Objects Overview                    41
  396. Object Similarities                    41
  397. Object Maximums                        42
  398. Using an Object                        42
  399. Input/Ouput Objects                    43
  400. Object structures                    43
  401. The Blitz Objects                    44
  402. Screens                            44
  403. Windows                            44
  404. Gadget and Menu lists                    44
  405. Palettes                        44
  406. BitMaps                            45
  407. Shapes                            45
  408. Sprites                            45
  409. Slices                            45
  410. Files                            46
  411. Objects Summary                        46
  412.  
  413.  
  414. 7. BLITZ MODE                        47
  415.  
  416. Introduction to Blitz Mode                47
  417. Slice Maoic                        47
  418. Smooth Scrolling                    48
  419. Dual-Playfield                        48
  420. Copper Control                        48
  421. The Blitter                        49
  422. QAmiga Mode                        50
  423. Summary                            52
  424.  
  425.  
  426. 8. ADVANCED TOPICS                    53            
  427.  
  428. Resident Files                        53            
  429. Operating System Calls                    54            
  430. Operating System Libraries                54        
  431. Accessing OS Structures                    55            
  432. Locating Variables & Labels                55            
  433. Constants                        56            
  434. Conditional Compiling                    57            
  435. Macros                            58            
  436. Macro Parameters                    59        
  437. The '0 Parameter                    60            
  438. Recursive Macros                    60            
  439. Replacing Functions with Macros             61        
  440. The CMake Character                     61
  441. Inline Assembler                     62
  442. GetReg & PutReg                     62            
  443. Assembler in Procedures                    63
  444.  
  445.  
  446. 9. PROGRAMMING & OPTIMIZING
  447.  
  448. Label and Variable Names                65
  449. Style                            65
  450. Naming related problems                    66
  451. Remarks and Comments                    66
  452. Structured programming                    67
  453. Keeping things modular                    67
  454. Along the way...                    68
  455. Keeping your code readable                68
  456. Optimising Code                        69
  457. Algorithms                        69
  458. Loops                            69
  459. Lookup tables                        70
  460. Using Pointers                        70
  461. Testing Performance                    70
  462. Optimising Games                    71
  463.  
  464.  
  465. 10. PROGRAM EXAMPLES                    73
  466.  
  467. Number Guessing                        73
  468. Standalone WorkBench progs                74    
  469. A Graphic Example                    75
  470. Using Menus & File Requesters                76
  471. String Gadgets                        77
  472. Prop Gadgets                        78
  473. Database Type Aplication                79
  474. List Processor for Exec                    82
  475. Prime Number Generator                    83
  476. Clipped Blits                        84
  477. Dual Playtield Slice                    85
  478. Double Buffering                    86
  479. Smooth Scrolling                    87
  480.  
  481. 11. THE DISPLAYLIBRARY&AGA                89
  482. Introduction                        89
  483. Initialising                        89
  484. Flags used with InitCopList                90
  485. Colors                            90
  486. SmoothScrolling                        90
  487. DualPlayfield                        91
  488. Sprites                            91
  489. FetchMode                        91
  490. Multiple Displays                    91
  491. Advanced Copper Control                    92
  492. Display Example 1                    93
  493. Display Example 2                    94
  494.  
  495. COMMAND REFERENCE SECTION
  496.  
  497. R-1: PROGRAM FLOW                 95
  498. R-2: VARIABLE HANDLING                 101
  499. R-3: INPUTOUTPUT COMMANDS             105
  500. R-4: FILE HANDLING & IFFINFO             109
  501. R-5: NUMERIC&STRING FUNCTIONS             113
  502. R-6:  COMPILER DIRECTIVES            121
  503. R-7:  ASSEMBLER DIRECTIVES            125
  504. R-8:  MEMORY CONTROL                127
  505. R-9:  PROGRAM STARTUP                129
  506. R-10: SLICE COMMANDS                131
  507. R-11: DISPLAY LIBRARY                135
  508. R-12: BLITZMODE IO COMMANDS            140
  509. R-13: BITMAP COMMANDS                144
  510. R-14: 2D DRAWING COMMANDS            146
  511. R-15: ANIMATION SUPPORT                148
  512. R-16: SHAPE HANDLING                149
  513. R-17: BLITTING COMMANDS                153
  514. R-18: SPRITE HANDLING                159
  515. R-19: COLLISION DETECTION            161
  516. R-20: PALETTE COMMANDS                163
  517. R-21: SOUND MUSIC & SPEECH            168
  518. R-22: SCREEN COMMANDS                173
  519. R-23: WINDOW COMMANDS                176
  520. R-24: GADGET COMMANDS                188
  521. R-25: MENU COMMANDS                195
  522. R-26: GADTOOLS COMMANDS                198
  523. R-27: ASL LIBRARY COMMANDS            202
  524. R-28: AREXX CONTROL                203
  525. R-29: BREXX COMMANDS                211
  526. R-30: SERIAL PORT COMMANDS            214
  527.  
  528.  
  529. APPENDIX
  530.  
  531. A-1:    COMPILE TIME ERRORS            217
  532. A-2:    OPERATINGSYSTEM CALLS        227
  533. A-3:    AMIGA HARDWARE REGISTERS    237
  534. A-4:    68000 ASSEMBLY LANGUAGE     247
  535. A-5:    RAWKEY CODES                253
  536.  
  537.  
  538. 1. GETTING STARTED
  539.  
  540. Installing Blitz
  541.  
  542. There  are  two  install  programs included on Diskl  of  the  Blitz  disks,
  543. HDInstall  and  Floppyinstall.  From Workbench click  on  the  one  that  is
  544. applicable.  Those installing onto harddisk will want to make sure they have
  545. at  least  4 megs free in the partition they are installing to while  floppy
  546. users  will be informed by the Floppyinstall program of the number of  blank
  547. disks they will need to unpack all the data onto.
  548.  
  549. Registration Card
  550.  
  551. Please  fill out this card and mail it back to Acid Software.  You will  not
  552. be  eligible  for  any  support,  bug fixes and updates without  registering
  553. yourself as a Blitz2 user.  We would also like to here about what  you  want
  554. to use Blitz2 for and any things you think need adding to Blitz2.
  555.  
  556. OkeeDokee?
  557.  
  558. Once  you have a working backup of the disks or have installed Blitz 2  onto
  559. your harddisk its time to take your new programming language for a spin:
  560.  
  561. Double click the Blitz2 icon to run the editor/compiler.  The editor  screen
  562. should appear with a copyright notice (which should NOT be ignored!).  Click
  563. on OkeeDokee and you're up and running.
  564.  
  565. Running the Examples
  566.  
  567. Okee  dokee,  if you have got this far without any problems you're ready  to
  568. drive  the  speed machine (thats the Blitz 2 editor/compiler  we're  talking
  569. about).
  570.  
  571. Select  the  LOAD  menu  item,   insert the  examples  disk  or  select  the
  572. Blitz2:Examples  drawer on your harddisk and load in one  of  the  examples.
  573. Any  file  ending with the suffix .bb2 is a source file able  to  be  loaded
  574. into  the Blitz2 editor/compiler.  Once you have loaded a .bb2 file  have  a
  575. read,   guess  what it's going to do then select compile and  run  from  the
  576. compiler menu.
  577.  
  578. The  only  problem you should have with running the examples is to  do  with
  579. 'Current Directories'.
  580.  
  581. Page 1
  582.  
  583. Current Directories
  584. If  you changed the pathname in the file-requester to locate the example you
  585. loaded  you will usually need to click on the CD gadget before selecting  OK
  586. on  the  file- requester.  This changes the current directory to that  which
  587. you loaded the example.
  588.  
  589. By  changing the current directory.  any files the program attempts  to  use
  590. will  be  loaded from the same directory as that from which the source  code
  591. was loaded.
  592.  
  593. This  means that when the program is executed (run)  and attempts  t`'  load
  594. any  data  or graphics from disk,  the default path (directory it looks  for
  595. files)  will be set to,  the same directory as where the program itself  was
  596. loaded
  597.  
  598. If  the example comes up with a runtime error "Couldn't Load Shape"  or  the
  599. like  it  will be because the current directory has not been  to  set.   Hit
  600. Escape to exit the debugger and return to the editor.
  601.  
  602.   If  the  example  crashes the machine,  it its  because  the  same  error
  603. occurred but error checking was disabled on the compiler options menu.
  604.  
  605. Using Ted the Blitz2 Editor
  606.  
  607. To enter and compile your programs you need an editor.  Blitz2 comes with  a
  608. text  editor that acts both as an interface to the Blitz2 compiler  as  well
  609. as  a  standalone  ascii editor (ascii is the computer standard  for  normal
  610. text)
  611.  
  612. The  horizontal and vertical bars are called 'scroll bars'.  when  the  file
  613. you  are  editing is longer or wider than the screen you can  position  your
  614. view  of  the file by dragging these bars inside their boxes with  the  left
  615. mouse button.
  616.  
  617. At  the  bottom  of  the screen is information about the cursor  position  r
  618. elative  to  the  start of the file you are editing  as  well  as  a  memory
  619. monitor  that  lets you know the largest block of memory available  in  your
  620. Amiga system.
  621.  
  622. Using the left mouse button you can drag the Blitz2 screen up and down  just
  623. like  any other Amiga screen as well as place it to the back with the  front
  624. to back gadgets at the top right of the screen.
  625.  
  626.  
  627.  
  628. Entering Text
  629.  
  630. The  editor can be treated just like a standard typewriter,  just  go  ahead
  631. and type, using the return key to start a new line.
  632.  
  633. The  small  box  that  moves across the screen as you  type  is  called  the
  634. cursor.   Where the cursor is positioned on the screen is where the  letters
  635. will appear when you type.
  636.  
  637. By  using  the  arrow  keys you can move the cursor  around  your  document,
  638. herein to be known as the file.
  639.  
  640. If  you  place the cursor in the middle of text you have already  typed  you
  641. can  insert letters just by typing,  the editor will move all the characters
  642. under  and  to  the  right of the cursor along one and insert  the  key  you
  643. pressed into the space created.
  644.  
  645. The DEL key will remove the character directly under the cursor and move the
  646. remaining text on the line left one character to cover up the gap.
  647.  
  648. The  key to the left of the DEL key will also remove a character but  unlike
  649. the  DEL  key it removes the character to the left of the cursor moving  the
  650. cursor and the rest of the line to the left.
  651.  
  652. The TAB key works similar to a typewriter moving the cursor and any text  to
  653. the right of the cursor right by so many columns.
  654.  
  655. The  RETURN key as mentioned allows you to start a new line.  If you are  in
  656. the  middle of a line of text and want to move all text to the right of  the
  657. cursor  down to a new line use shift RETURN,  this is known as  inserting  a
  658. carriage return.
  659.  
  660. To join two lines of text use the Amiga keyboard combination.
  661.  
  662. Using  the  shift keys in combination with the arrow keys you can  move  the
  663. cursor  to the very start or end of a line and up and down a whole  page  of
  664. the document.
  665.  
  666. By  pointing  with the mouse to a position on the screen you  can  move  the
  667. cursor there by clicking the left mouse button.
  668.  
  669. See  keyboard shortcuts at the end of this chapter for other important  keys
  670. used with the Blitz2 editor.
  671.  
  672. Highlighting blocks of text
  673.  
  674. When editing text,  especially programs you often need to operate on a block
  675. of text.  Position the mouse at the start or end of the block, hold down the
  676. left  mouse  button and drag the mouse to highlight the  area  you  wish  to
  677. copy,  delete,  save or indent. While holding down the button you can scroll
  678. the display by moving the pointer to the very top or bottom of the display.
  679.  
  680. You  can also select a block with the keyboard,  position the cursor at  the
  681. start of the block of text,  hit the Fl key then position the cursor at  the
  682. end of the text and hit F2.
  683.  
  684. Page 3
  685.  
  686. A  special  feature   for   structured   programmers   is  the  Amiga-A  key
  687. combination,  this automatically highlights the current line and  any  above
  688. or below that are indented the same number of spaces.
  689.  
  690. The Editor Menus
  691.  
  692. Using  the  right mouse button you can access the menu system of the  Blitz2
  693. editor.  The following is a list of the features accessible from these menus
  694. in order from left to right.
  695.  
  696. The PROJECT Menu
  697.  
  698. NEW 
  699.  
  700. Kills the file you are editing from the Amiga's memory.  If the file has
  701. been  changed since it was last saved to disk a requester will  ask  you  if
  702. you really wish to NEW the file.
  703.  
  704. LOAD
  705.  
  706. Reads a file from disk.  A file requester appears when you select LOAD which
  707. enables you to easily select the file you wish to edit.  See later  in  this
  708. chapter for a full description of using the file requester.
  709.  
  710. SAVE
  711.         
  712. Writes  your  file to disk.  A file requester appears when you  select  SAVE
  713. which enables you to easily select the file name you wish to save your  file
  714. as.   See  later in this chapter for a full description of  using  the  file
  715. requester.
  716.  
  717. DEFAULTS    
  718.  
  719. Changes the look of the Blitz2 editor.  You can edit the palette, select the
  720. size  of font and tell the system if you wish icons to be created when  your
  721. files  are saved.  The scroll margins dictate how far from the edge  of  the
  722. screen your cursor needs to be before Blitz scrolls the text.
  723.  
  724. ABOUT        Displays version number and credits concerning Blitz2.
  725.  
  726.  
  727.  
  728. PRINT        
  729.  
  730. Sends your file to an output device usually PRT: the printer device.
  731.  
  732. CLI            
  733.  
  734. Launches a command line interface from the editor, use the
  735. ENDCLI command to close this CLI and return to the Blitz2 editor.
  736.  
  737. CLOSEWB        
  738.  
  739. Closes WorkBench if it is currently open.  This option should only  be  used
  740. if  you are running very short on memory as closing WorkBench can free about
  741. 40K of valuable ChipMem.
  742.  
  743. QUIT        
  744.  
  745. Close the Blitz2 editor and returns you to workbench or CLI.
  746.  
  747. Page 4
  748.  
  749.  
  750. The EDITMenu
  751.  
  752. COPY        
  753.  
  754. Copies  a  block  of text that is highlighted with the mouse  or  fl-f2  key
  755. combination to the current cursor position.  The F4 key is another  keyboard
  756. shortcut for COPY. KILL
  757.  
  758. Deletes  a  highlighted block of text (same as shift F3  key).   BLOCKTODISK
  759. Saves a highlighted block of text to disk in ascii format.
  760.  
  761. INSERTFROMDISK
  762.  
  763. Loads a file from disk and inserts it into the file you are editing  at  the
  764. current cursor position.
  765.  
  766. FORGET
  767.  
  768. De-selects a block of text that is selected (highlighted). INSERTLINE
  769.  
  770. Breaks the line into two lines at the current cursor position. DELETE LINE
  771.  
  772. Deletes the line of text the cursor is currently located on.
  773.  
  774. DELETE RIGHT
  775.  
  776. Deletes all text on the line to the right of the cursor. JOIN
  777.  
  778. Places the text on the line below the cursor at the end of the current line.
  779.  
  780. BLOCK TAB    Shifts all highlighted text to the right by one tab margin.
  781.  
  782. BLOCK UNTAB    Shifts all highlighted text to the left by one tab margin.
  783.  
  784. The SOURCE Menu
  785.  
  786. TOP        Moves the cursor to the top of the file
  787.     
  788. BOTTOM        Moves the cursor to the last line of the file.
  789.  
  790. GOTO LINE    Moves the cursor to the line number of your choice.
  791.  
  792. Page 5
  793.  
  794.  
  795. The SEARCH Menu
  796.  
  797. FIND    Will search the file for a string of characters.
  798.  
  799. NEXT    Positions the curosr at the next occurrence of the Find-String
  800.     entered using the FIND menu option (as below).
  801.  
  802. PREVIOUS    
  803.  
  804. Will position the curosr at the last occurrence of the Find:  String entered
  805. using the FIND menu option (as below).
  806.  
  807. REPLACE        Will carry out the same function as discussed in the FIND
  808.         requester below.
  809.  
  810. After selecting FIND in the SEARCH menu the following requester will appear:
  811. Type  the string that you wish to search for into the top string gadget  and
  812. click on NEXT.  This will position the cursor at the next occurrence of  the
  813. string, if there is no such string the screen will flash.
  814.  
  815. Use the PREVIOUS icon to search backwards from the current cursor position.
  816.  
  817. The  CASE SENSITIVE option will only find strings that have the same letters
  818. capitalized,   default is that the search will ignore  whether  letters  are
  819. caps or not.
  820.  
  821. To  replace the find string with an alternate string click on the  box  next
  822. to REPLACE:  and type the alternate string. REPLACE will search for the next
  823. occurrence of the Find:  string,  delete it,  and insert the Replace: string
  824. in it's place.
  825.  
  826. REPLACE  ALL  will  carry  on  through   the  file  doing  replaces  on  all
  827. occurrences of the Find: string.
  828.  
  829. Page 6
  830.  
  831.  
  832. The Blitz File Requester
  833.  
  834. When you select load or save,  Blitz2 places a file requester on the screen.
  835. With the file requester you can quickly and easily find the file on a disk.
  836.  
  837. Clicking  on  the  top  left of the window or on the CANCEL  gadget  at  the
  838. bottom right will cancel the file requester returning you to the editor.
  839.  
  840. The  slider at the right enables you to scroll up and down through the files
  841. in the currently selected directory (drawer).
  842.  
  843. Double  clicking on a file name (pointing to the name and pressing the  left
  844. mouse button twice) will select that file name.
  845.  
  846. Clicking  on  a  <DIR>  will change to that directory  and  list  the  files
  847. contained in it.
  848.  
  849. Clicking on PARENT will return you to the parent directory.
  850.  
  851. Clicking on drives adds a list of all drives,  volumes and assigned  devices
  852. to the top of the file list so you can move into their directories.
  853.  
  854. You can also enter path and file names with the keyboard by clicking on  the
  855. boxes next to PATH:  and FILE: and entering the suitable text. Then Click on
  856. the OK gadget.
  857.  
  858. CD  is  a  special  command used when programming in Blitz2  to  change  the
  859. editors  current directory to that specified in the path name.   This  means
  860. that  when  you  select  CLI  or launch a task  from  the  editor  its  root
  861. directory will be that selected by the CD gadget.
  862.  
  863. The  last  feature of the Blitz2 FileRequester is the ability  to  size  its
  864. window,   h  dragging the bottom right of the window  with  the  left  mouse
  865. button you can see m more files at one time.
  866.  
  867. Page 7
  868.  
  869.  
  870. The Compiler Menu
  871.  
  872. The  following  is a discussion of the extra options and commands  available
  873. with  Ted  when used in Blitz2 programming mode.  The Compiler menu includes
  874. all the commands needed to control the Blitz2 compiler.
  875.  
  876. COMPILE/RUN     Compiles your Blitz2 program to memory and if there are no
  877.         errors run the program.
  878.  
  879. RUN        Runs the program if it has already been successfully
  880.         compiled to memory.
  881.  
  882. CREATE FILE     Compile your Blitz2 program to disk as an executable
  883.         program.
  884.  
  885. OPTIONS     See next page for details about Blitz2 compiler options.
  886.  
  887. CREATERESIDENT     
  888.  
  889. Will  create a 'resident file' from the current file.  A resident is a  file
  890. including  all  constants   and   macro   definitions  as  well  as  newtype
  891. definitions.  By removing large chunks of these definitions from  your  code
  892. and creating a resident (pre- compiled)  file a dramatic increase in compile
  893. speed can be attained.
  894.  
  895. VIEW TYPE        
  896.  
  897. Allows you to view all currently resident types.  Click on the type name and
  898. its  definition will be shown.  Subtypes can be viewed from  this  expansion
  899. also.
  900.  
  901. CLI ARGUMENT
  902.  
  903. Enables  you to pass parameters to your program when executing it  from  the
  904. Blitz2 editor environment just as if you had run the program from the CLI.
  905.  
  906. CALCULATOR
  907.  
  908. Allows you do to calculations in base 2,  10 and 16. Precede hex values with
  909. $ and binary with %. It also supports multi levels of parenthesis.
  910.  
  911. RELOAD ALL LIBS 
  912.  
  913. Will  read  all  files  from  BLITZLIBS:   back  into  the  Blitz2  compiler
  914. environment.  This is useful when writing your own Blitz2 libraries and wish
  915. to test them without having to re-run Blitz2.
  916.  
  917.  
  918. Page 8
  919.  
  920.  
  921. Compiler Options
  922.  
  923. The  following  is  a  discussion  of the Options  requester  found  in  the
  924. Compiler menu.
  925.  
  926. Create Icons for Executable Files:  if on,  the compiler creates an icon  to
  927. accompany  the  file created with the CREATE FTLE option.   This  means  the
  928. program  will be accessible from the WorkBench.  Note:  for the  program  to
  929. execute  correctly when run from workbench the WBStartUp command  should  be
  930. included at the top of the source code.
  931.  
  932. Enable Runtime Errors:when on will trap runtime errors and invoke the Blitz2
  933. debugger.   See  Chapter 5 for a thorough discussion of  runtime  errors  in
  934. Blitz2.
  935.  
  936. Make Smallest Code:  selects two pass compile mode,  which always calculates
  937. the minimum amount of memory required for the object code.  Make Smallest is
  938. automatically selected when creating executable files.  Unselected, programs
  939. will compile quicker.
  940.  
  941. Debug Info:  creates a symbols table during CREATE FILE so executable can be
  942. debugged more easily with debuggers such as Metadigm's excellent MetaScope.
  943.  
  944. Buffer Sizes:  allows different buffers to be altered when using Blitz2 as a
  945. one  pass  compiler.  These buffers are automatically optimized  when  using
  946. MakeSmallest  (two pass compile).  The one exception is  the  string  buffer
  947. setting,   if  using large strings (such as reading entire  files  into  one
  948. string)  the string workspace buffer should be increased in size  to  handle
  949. the largest string used.
  950.  
  951. Object Maximums:  allows setting of maximum number of Blitz2 objects such as
  952. screens,   shapes etc.  See Chapter 6 for a thorough explanation  of  Blitz2
  953. objects and their maximum settings.
  954.  
  955. Resident:  adds precompiled resident files to the Blitz2 environment.  Click
  956. in the box and type in the resident file name.
  957.  
  958. Page 9
  959.  
  960.  
  961. Keyboard Shortcuts
  962.  
  963. Having to reach for the mouse to execute some of the editor commands can  be
  964. a  nuisance.  The following is a list of keyboard shortcuts that execute the
  965. same options that are available in the menus.
  966.  
  967. The  right  Amiga key is just to the right of the space bar  and  should  be
  968. used  like the shift key in combination with the stated keys to execute  the
  969. following commands:
  970.  
  971. Amiga  A  SELECTs all text that is indented the same amount as  the  current
  972. line (strictly for structured programming housekeeping)
  973.  
  974. Amiga B BOTTOM will position cursor on last line of file
  975.  
  976. Amiga  D  DELETE  LINE  removes the line of text  on  which  the  cursor  is
  977. currently positioned
  978.  
  979. Amiga F FIND/REPLACE executes the FIND command in the SEARCH menu
  980.  
  981. Amiga G GOTO LINE moves cursor to specific line of file
  982.  
  983. Amiga I INSERT LINE moves all text at and below the cursor down one line
  984.  
  985. Amiga J JOIN LINE adjoins next line with current line
  986.  
  987. Amiga L LOAD reads a file from disk
  988.  
  989. Amiga N NEXT searches for the next occurrence of the 'find string'
  990.  
  991. Amiga P PREVIOUS searched for previous occurrence of the 'find string'
  992.  
  993. Amiga Q QUIT will exit the Blitz2 editor
  994.  
  995. Amiga  R REPLACE will replace text at cursor (if same as find string)   with
  996. the alternate string specified with the Find command.
  997.  
  998. Amiga S SAVE writes a file to disk
  999.  
  1000. Amiga T TOP moves the cursor to the top of the file
  1001.  
  1002. Amiga W FORGET will unhighlight a selected block of text
  1003.  
  1004. Amiga Y DELETE TO RIGHT of cursor
  1005.  
  1006. Amiga Z CLI
  1007.  
  1008. Amiga  ? DEFAULTS allows the user to change the look and feel of the  Blitz2
  1009. editor
  1010.  
  1011. Amiga ] BLOCK TAB moves whole block right one tab
  1012.  
  1013. Amiga [ BLOCK UNTAB moves whole block left one tab
  1014.  
  1015. Page 10
  1016.  
  1017.  
  1018. 2. BLITZ BASIC'S
  1019.  
  1020. My First Program
  1021.  
  1022. Type in the following two lines:
  1023.  
  1024. Print "This is my first program written in Blitz2!"
  1025. MouseWait
  1026. End
  1027.  
  1028. Then using the right button select COMPILE&RUN from the top right menu.
  1029.  
  1030. If  you  have typed the program in correctly a Blitz2 CLI Window will appear
  1031. with the message,  click the mouse button to return to the editor Thats  all
  1032. there is to it!
  1033.  
  1034. The Print Command
  1035.  
  1036. Position  the  cursor on the Print statement and press the  HELP  key,   the
  1037. syntax  for the Print command appears at the top of the screen.   It  should
  1038. read:
  1039.  
  1040. Print Expression[,Expression...]
  1041.  
  1042. The  square brackets mean that the Print command will accept any  number  of
  1043. expressions  separated by commas.  An expression can be any number,   string
  1044. (text  in  "quotes"),  variable or BASIC calculation.  The following  is  an
  1045. example of all these.
  1046.  
  1047. Don't forget to include the MouseWait command when you test this,  otherwise
  1048. Blitz2  will print the message and return you to the editor before you  even
  1049. have time to read it.
  1050.  
  1051.     Print 3,"CARS",a,a*7+3
  1052.  
  1053. The following should be printed out on the CLI window:
  1054.  
  1055.     3CARS03
  1056.  
  1057. If we add some spacing between each expression like so:
  1058.  
  1059.     Print 3," CARS ",a," ",a*7+3
  1060.  
  1061. The result will be the line:
  1062.  
  1063.     3 CARS O 3
  1064.  
  1065. Page 11
  1066.  
  1067.  
  1068. Formatted Printing
  1069.  
  1070. We  can change the way Blitz2 prints numbers using the Format command,  this
  1071. is useful if want to print a list of numbers, in a column.
  1072.  
  1073. The  NPrint  command is used to move the cursor to a newline after  printing
  1074. the expressions.
  1075.  
  1076. Format "###.00"
  1077. Nprint 23.5
  1078. Nprint 10
  1079. Nprint .5
  1080. Nprint 0
  1081. MouseWait
  1082.  
  1083. A Simple Variable
  1084.  
  1085. The  main power of a programming language lies in it's ability to manipulate
  1086. numbers and text. Variables are used to store these pieces of information.
  1087.  
  1088. The following line will store the value 5 in the variable a:
  1089.  
  1090.     a=5
  1091.  
  1092. The variable a now holds the value 5.  We can tell the computer to add I  to
  1093. the value of a making it 6 using the following expression:
  1094.  
  1095.     a=a+1
  1096.  
  1097. An expression can contain more than one operation,  brackets can be used  to
  1098. make one operation be evaluated before the others:
  1099.  
  1100.     a=(a+3)*7
  1101.  
  1102. Blitz2 Operators
  1103.  
  1104. An evaluation is a collection of variables, constants, functions and operators.
  1105. Examples of operators are the plus and minus signs.
  1106.  
  1107. An  operator  will  generate an outcome using either the  variable  on  it's
  1108. right:
  1109.  
  1110.     a=NOT 5
  1111.     
  1112. or from the variables on it's left and right:
  1113.  
  1114.     a=5+2
  1115.  
  1116. An evaluation can include multiple operators:
  1117.  
  1118.     a=5*6+3
  1119.  
  1120. Page 12
  1121.  
  1122.  
  1123. As  in  mathematics the order the operators are evaluated  will  affect  the
  1124. outcome,  if the multiply is done first in the above example the  result  is
  1125. 33, if the addition was done first, 5*(6+3), the result will be 40.
  1126.  
  1127. When  Blitz  performs  an  evaluation some operators  have  precedence  over
  1128. others and will be evaluated first,  the following two evaluations will have
  1129. the  same  result because Blitz2 will always evaluate multiplication  before
  1130. addition:
  1131.  
  1132.     a=5*6+3 is the same as a=3+5*6
  1133.  
  1134. To override the order which Blitz2 evaluates the above,  parenthesis can  be
  1135. added, operations enclosed in parenthesis will be evaluated first:
  1136.  
  1137.     a=5*(6+3)
  1138.  
  1139. The  following table lists the Blitz2 operators grouped in order of priority
  1140. (LHS=lett hand side,  RHS=right hand side).  Operators in the same box  have
  1141. the same priority.
  1142.  
  1143. NOT            RHS logically NOTted
  1144.             RHS arithmetically negated
  1145.  
  1146. BITSET        LHS with RHS bit set
  1147. BITCLR        LHS with RHS bit cleared
  1148. BITCHG        LHS with RHS bit changed
  1149. BITTST        true if LHS bit of RHS is set
  1150.  
  1151. /\            LHS to the power of RHS
  1152.  
  1153. LSL            LHS logically shifted left RHS times
  1154. ASL            LHS arithmetically shifted left RHS times
  1155. LSR            LHS logically shifted right RHS times
  1156. ASR            LHS arithmetically shifted right RHS times
  1157.  
  1158. &            LHS logically ANDed with RHS
  1159. |            LHS logically ORed with RHS
  1160.  
  1161. *            LHS multiplied by RHS
  1162. /            LHS divided by RHS
  1163.  
  1164. +            LHS added to RHS
  1165. -            RHS subtracted from LHS
  1166.  
  1167. =            true if LHS is equal to RHS
  1168. <>            true if LHS is not equal to RHS
  1169. <            true if LHS is less than RHS
  1170. >            true if LHS is greater than RHS
  1171. <=            true if LHS is less than or equal to RHS
  1172. >=            true if LHS is greater than or equal to RHS
  1173.  
  1174. AND            LHS logically ANDed with RHS
  1175. OR            LHS logically ORed with RHS
  1176.  
  1177. Page 13
  1178.  
  1179.  
  1180. Boolean Operators
  1181.  
  1182. The  boolean system can only operate with two values,  true and  false.   In
  1183. Blitz2  false is represented by the value (),  true with the value -1.   The
  1184. operators =,  <>,  <=,  =>,  > and < all generate a boolean result (true  or
  1185. false).
  1186.  
  1187. NPrint  2=2 will print the value - I as the result of the operation  2=2  is
  1188. true.   The  operators  OR,  AND and NOT can be used as  boolean  operators,
  1189. Nprint  2=2 AND 5=6 will print ()  as the result is false.  The OR  operator
  1190. will return true if either the left or the right hand side is true.  The NOT
  1191. operator  returns false if the following operand is true  and  true  if  the
  1192. operand is false.
  1193.  
  1194. Binary Operators
  1195.  
  1196. Many  of  the  Blitz2  operators  perform  binary  type  arithmetic.   These
  1197. operations  are very fast as they directly correspond to instructions  built
  1198. into the computer's microprocessor.
  1199.  
  1200. The binary system means that all numbers are represented by a series of I  s
  1201. and 0s. A byte is made up of X such bits, a word 16 and a long word 32.
  1202.  
  1203. Further  discussion of the binary operators in Blitz2 can be  tound  in  any
  1204. text covering the 68000 microprocessor.
  1205.  
  1206. Multiple Commands
  1207.  
  1208. The  following program starts a with a value of 0,  it then proceeds to  add
  1209. 12 to the value of a and print the result 4 times.
  1210.  
  1211.     a=0
  1212.     a=a+12:Nprint a
  1213.     a=a+12:Nprint a
  1214.     a=a+12:Nprint a
  1215.     a=a+12:Nprint a
  1216.     MouseWait
  1217.  
  1218. Note how we can put two commands on the same line by separating each command
  1219. with a colon character.  Also, the first line a=0 is not needed as variables
  1220. in Blitz2 always start out with a value of 0 anyway.
  1221.  
  1222. A Simple Loop
  1223.  
  1224. The  following program prints out the 12 times table.  Instead of typing  in
  1225. 12 lines to do this we use a For..Next loop.  A loop is where the program is
  1226. told to repeat a section of program many times.
  1227.  
  1228. For  i=1 To 12..Next will execute the commands between the For and  Next  12
  1229. times, the variable i is used to keep count.
  1230.  
  1231. The asterisk * means multiply,  a=i*12 means the variable a now equals 12  x
  1232. the
  1233.  
  1234. Page 14
  1235.  
  1236.  
  1237. variable i. Because i is counting up from 1 to 12 the variable a is assigned the values 12, 24, 36,4X.. as the program loops.
  1238.  
  1239.     For i=1 To 12 
  1240.         a=i*1 2 
  1241.         NPrint i,"*",12,"=",a 
  1242.     Next 
  1243.     MouseWait
  1244.     End
  1245.  
  1246. Note  how  the 2 lines inside the loop are indented across the  page.   This
  1247. practice  makes  it easy to see which bits of the program are  inside  loops
  1248. and which are not.
  1249.  
  1250. The  Tab  key can be used to move the cursor across the page so many  spaces
  1251. when typing in lines that are indented.
  1252.  
  1253. Now  try  changing the first line to For i=l To 100,  as  you  can  see  the
  1254. computer has no problem what so ever doing it's 12 times table!
  1255.  
  1256. We  could also change the number 12 in the first 3 lines to any other number
  1257. to generate an alternative times table.
  1258.  
  1259. Nested Loops
  1260.  
  1261. The following program is an example of nesting loops,  a term that refers to
  1262. having  loops  inside of loops.  By indenting the code that  is  inside  the
  1263. inner  loop even further we can keep a check to make sure each For statement
  1264. lines up with each Next statement.
  1265.  
  1266.     For y=1 To 12
  1267.         For x=1 To 12
  1268.             NPrint y,"*",x,"=",x*y
  1269.         Next
  1270.     Next
  1271.     MouseWait
  1272.  
  1273. The  nesting  of the For x=1 To 12 inside the For y=1 To 12 means  the  line
  1274. inside  the  For x will be executed 12 x 12 times,  each  time  with  a  new
  1275. combination of x and y.
  1276.  
  1277. While..Wend and Repeat..Until
  1278.  
  1279. There  are  two  other simple ways to program loops in Blitz2 besides  using
  1280. For..Next.
  1281.  
  1282. While..Wend and Repeat..Until loops are used as follows:
  1283.  
  1284.  
  1285.     While a<20 
  1286.         Nprint a 
  1287.         a=a+1 
  1288.     Wend
  1289.  
  1290. Page 15
  1291.  
  1292.  
  1293.     Repeat 
  1294.         Nprint a 
  1295.         a=a+1
  1296.     Until a>=20
  1297.  
  1298. As  with a lot of BASIC commands they are pretty much self explanatory,  the
  1299. inside  of a While..Wend will be repeated while the condition remains  true.
  1300. a Repeat..Until will loop until the condition is true.
  1301.  
  1302. A  condition can be any evaluation such as While a+l0<SO,  While f=0,  While
  1303. b<>x*2 and so on.
  1304.  
  1305. The difference between the two loops above is that if a was greater than  20
  1306. to  start  with,  the Repeat..Until would still execute the code inside  the
  1307. loop once, where as the While..Wend would not.
  1308.  
  1309. Endless Loops
  1310.  
  1311. When  a program gets into the situation of repeating a loop for ever  it  is
  1312. called  an endless loop.  In this situation the programmer must be  able  to
  1313. override the program and tell it to stop.
  1314.  
  1315. To  interrupt  a  program the Ctrl/Alt C keyboard  sequence  must  be  used.
  1316. Holding down the Ctrl key and the LeftAlt key press C,  this will  stop  the
  1317. program and the debugger screen will appear.  To exit from the debugger  and
  1318. return  to  the  editor  use the Esc key (top left of  the  keyboard).   The
  1319. debugger is covered in detail in Chapter 5.
  1320.  
  1321. Using String Variables
  1322.  
  1323. Variables that contain text not numbers are called string variables.  String
  1324. variables  require  the $ signs after their names.  The  following  shows  a
  1325. simple example of a string variable:
  1326.  
  1327.     a$="Simon"
  1328.     Nprint a$
  1329.     MouseWait
  1330.  
  1331. Similar  to  numeric  variables the = sign is  used  to  assign  the  string
  1332. variable  a  value.   The  +  sign  can be  used  to  add  strings  together
  1333. (concatenate):
  1334.  
  1335.     a$="Simon ": b$="Armstrong" :c$=a$+b$
  1336.  
  1337. The  variable  c$  will  now  contain  the string  "SimonArmstrong".   Other
  1338. functions that manipulate strings are detailed in the reference  section  of
  1339. this manual.
  1340.  
  1341. Page 16
  1342.  
  1343.  
  1344. Program Flow
  1345.  
  1346. Often a program will have to decide to do either one thing or another,  this
  1347. is  called prograzn flow.  The If Then commands are used to tell the program
  1348. to  do  something only If some condition is true.  The following  will  only
  1349. print "Hello" if the variable a has the value 5:
  1350.  
  1351.     If a=5 Then Print "Hello"
  1352.  
  1353. The  above line could be changed to do a section of commands if a was  equal
  1354. to 5 using the IF..Endif structure:
  1355.  
  1356.     If a=5
  1357.         Print "Hello"
  1358.         a=a-1
  1359.     Endif
  1360.  
  1361. The  Else command is used to execute an alternative section if the condition
  1362. is not true:
  1363.  
  1364.     If a=5
  1365.         Print "Hello"
  1366.     Else
  1367.         Print "GoodBye"
  1368.     Endif
  1369.  
  1370. Note  how  we indent code inside conditional blocks just like  we  did  with
  1371. loops.  This makes the code more readable,  it is easier to see which  lines
  1372. of code will be executed when the condition is true etc.
  1373.  
  1374. The  condition  after  the  If command can be any complex  expression,   the
  1375. following are some examples of possible test conditions:
  1376.  
  1377.     If a=1 OR b=2
  1378.     If a>b+5
  1379.     If (a+10)*50 <> b/7-3
  1380.  
  1381. An  appendix  at  the end of this manual contains a complete description  of
  1382. using multiple operators and their precedence.
  1383.  
  1384. Jumpin' Around
  1385.  
  1386. Often the program will need to jump to a different section of the code.  The
  1387. Goto and Gosub routines are used for this.  The location that the program is
  1388. jumping  to needs a label so that Goto and Gosub can reference the  location
  1389. they are jumping to. The following uses the label start:
  1390.  
  1391.     Goto start
  1392.     NPrint "HI THERE"
  1393.     start
  1394.     MouseWait
  1395.  
  1396. Page 17
  1397.  
  1398.  
  1399. Because  the Goto statement makes the program jump to the label start,   "Hi
  1400. There" is never printed.
  1401.  
  1402. The Gosub comn1and is used to jump to a subroutine,  a subroutine is a piece
  1403. of code terminated with a Return statement.  This means that after executing
  1404. the  subroutine,  the program flow returns to where the  Gosub  command  was
  1405. executed and carries on.
  1406.  
  1407.     .start:
  1408.         Gosub message
  1409.         Gosub message
  1410.         Gosub message
  1411.         MouseWait
  1412.         End
  1413.  
  1414.     .message
  1415.         NPrint "Hello"
  1416.         Return
  1417.  
  1418. Note  how  the  labels are preceded with a period This makes  them  mousable
  1419. labels  which  appear in a list on the right of the editor screen.   We  can
  1420. make  the  cursor  jump to a label by clicking it in  this  list.   This  is
  1421. extremely useful for finding your way around when editing large programs.
  1422.  
  1423. Getting Input from the User
  1424.  
  1425. A  program will often require input from the user when it is running  either
  1426. via  the keyboard or mouse.  For instance,  the MouseWait command will  stop
  1427. the program until the user clicks the left mouse button.
  1428.  
  1429. Keyboard input can be obtained using the Edit and Edit$ functions  which  is
  1430. the same as the Input command in other languages.
  1431.  
  1432. The  following asks the user for their name,  and places what they type into
  1433. a string variable:
  1434.  
  1435.     Print "What is your name?"
  1436.     a$=Edit$(80)
  1437.     NPrint "Hello ",a$
  1438.     MouseWait
  1439.  
  1440. The  number 80 in Edit$(80)  refers to the maximum number of characters  the
  1441. user can type.
  1442.  
  1443. To  input numbers from the user the Edit function is used,  a=Edit(80)  will
  1444. let  the user type in any number up to 80 digits long and will place  it  in
  1445. the variable a.
  1446.  
  1447. Page 18
  1448.  
  1449.  
  1450. Arrays
  1451.  
  1452. Often  a  program will need to manipulate groups of numbers or strings.   An
  1453. array  is  able  to  hold such groups.  If we needed to keep  track  of  ten
  1454. numbers that were all related,  instead of using ten different variables  we
  1455. can define an array to hold them.
  1456.  
  1457. The Dim statement is used to define an array:
  1458.  
  1459.     Dim a(10)
  1460.  
  1461. The  variable a can now hold 10 (actually 11)  numbers,  to access  them  we
  1462. place an index number inside brackets after the variable name:
  1463.  
  1464.     a(1 )=5
  1465.     a(2)=6
  1466.     a(9)=22
  1467.     NPrint a(9)
  1468.     a(1)=a(1)+a(2)
  1469.     NPrint a(1)
  1470.  
  1471. The  power of an array is that the index number can be a variable,   if  i=2
  1472. then a(i) refers to the same variable ,IS a(2).
  1473.  
  1474. The  following  inputs  5  strings fron1 the user using  a  For..Next  loop,
  1475. because the strings are placed in an an-ay they can be printed back out:
  1476.  
  1477.     Dim a$(20)
  1478.  
  1479.     NPrint "Type in 5 names"
  1480.     Fori=1 To5
  1481.         a$ ( i) = Ed it$ (80)
  1482.     Next
  1483.  
  1484.     NPrint "The names you typed were"
  1485.     For i=1 To 5
  1486.         NPrint a$(i)
  1487.     Next
  1488.  
  1489.     MouseWait Next
  1490.  
  1491.  
  1492. Page 19
  1493.  
  1494.  
  1495. 3. TYPES, ARRAYS AND LISTS
  1496.  
  1497. Numeric Types
  1498.  
  1499. Blitz2  supports 6 different types of variables There are  5  numeric  types
  1500. for  storing numeric values with differing ranges and accuracies as well  as
  1501. a string type used to store strings of characters (text)
  1502.  
  1503. The  following  table  describes  each Blitz2  numeric  variable  type  with
  1504. details on its range and accuracy and how many bytes of memory each requires
  1505.  
  1506. Type    Suffix         Range        Accuracy        Bytes
  1507.  
  1508. Byte      .b          +-129         integer          1
  1509.  
  1510. Word      .w          +//-32768     integer                2
  1511.  
  1512. Long      .l              +/-2147483648  integer                4
  1513.  
  1514. Quick      .q              +/-32768.0000  1/65536                  2
  1515.  
  1516. Float      .f             +/-9*10/\18    1/10/\18                 4
  1517.  
  1518. The Quick type is a fixed point type,  less accurate than floating point but
  1519. faster.
  1520.  
  1521. The  Float  type  is the Floating Point type supported  by  the  Amiga  last
  1522. Floating Point libraries.
  1523.  
  1524. A  variable is assigned a certain type by adding the relevant suffix to it's
  1525. name After the first reference to a variable,  its type is assigned and  any
  1526. future references do not require the suffix unless it is a string variable.
  1527.  
  1528. The  following  are  some examples of typical numeric variables  with  their
  1529. relevant sutfix.
  1530.  
  1531.     mychar b=127
  1532.     my_score.w=32000
  1533.     chip.l=$dffOOO        ;$ denotes a hex value
  1534.     speed3.q=500/7        ;a quick has 3 d.p. accuracy
  1535.     light_speed.f=3e8    ;e is exponent i.e. 3X10A8
  1536.  
  1537.  
  1538. Page 21
  1539.  
  1540.  
  1541.  
  1542. Default Types
  1543.  
  1544. If  no  suffix  is used in the first reference of a variable,   Blitz2  will
  1545. assign  that  variable with the default type.  This is initially  the  Quick
  1546. type.
  1547.  
  1548. There  are two forms of the DefType command,  one which changes the  default
  1549. type  the  other which defines the type of a list of variables supplied  but
  1550. which does not affect the default type.
  1551.  
  1552. The following code illustrates both uses of DEFTYPE:
  1553.  
  1554.     a=20             ;a will be a quick
  1555.     DEFTYPE .f         ;vars without suffix will now default to float
  1556.     b=20             ;b will be a float
  1557.     DEFTYPE .w c,d     ;c & d are words, default still float
  1558.  
  1559. Note:  the second instance of DEFTYPE should be read define type rather than
  1560. its  first use which stands for change default type.  The default  type  can
  1561. also be set to a newtype (see following section).
  1562.  
  1563. Other  Blitz2  structures  that  work with  a  certain  type  such  as  data
  1564. statements,  functions,  peeks and pokes will also all use the default  type
  1565. if no type suffix is included.
  1566.  
  1567. The Data Statement
  1568.  
  1569. The  Data  statement is used-to hold a list of values that can be read  into
  1570. variables.   The  Restore command is used to point the  data  pointer  at  a
  1571. certain Data statement.
  1572.  
  1573. A.type suffix is added to the data statement to define what type the  values
  1574. listed are.
  1575.  
  1576. The following is an example of using Data in Blitz2:
  1577.  
  1578.     main:
  1579.         Read a,b,c
  1580.         Restore myfloats
  1581.         Read d.f
  1582.         Restore mystrings
  1583.         Read e$,f$,g$
  1584.     myquicks:
  1585.         Data 20,30,40
  1586.     myfloats:
  1587.         Data.f 20.345,10.7,90.111
  1588.     mystrings:
  1589.         Data$ "Hello","There","Simon"
  1590. Note:  if the data pointer is pointing to a different type than the variable
  1591. listed in the Read statement a Mismatched Types runume error occurs.
  1592.  
  1593. Page 22
  1594.  
  1595.  
  1596. Numeric Overflow & Unsigned Integers
  1597.  
  1598. When  a variable is assigned a value outside of it's range (too large),   an
  1599. overflow error will occur.  The following code will cause an overflow  error
  1600. when it is executed:
  1601.  
  1602.     a.w=32767     ;a is a word containing the number 32767
  1603.     a=a+1        ;ovefflow occurs as result is out of range
  1604.  
  1605. Overflow  checking is optional and can be enabled/ disabled in  the  RunTime
  1606. errors  options of the Compiler Configuration.  The default setting  is  off
  1607. meaning  the  above  code  will  not generate  a  runtime  error.   In  some
  1608. instances,   the  integer  types  will be  required  to  represent  unsigned
  1609. (positive only)  numbers.  For example,  a byte variable will be required to
  1610. hold  values  between O and 255 rather than -127 to 128.  Overflow  checking
  1611. has  to  be disabled in the Error Checking requester of the Compiler Options
  1612. window to use unsigned ranges such as this.
  1613.  
  1614. String Types
  1615.  
  1616. A  string  is  a  variable  that is used to store a  string  of  characters,
  1617. usually  text.   The suffix for a string variable is  either  a  .s  or  the
  1618. traditional $ character.
  1619.  
  1620. Unlike  numeric variables the suffix must always be included with the  name.
  1621. Also, string variable names MAY be re-used as numeric variable names.
  1622.  
  1623. The following is quite legal:
  1624.  
  1625.     a$="HELLO"
  1626.     a.w=20
  1627.     NPrint a,a$
  1628.  
  1629. System Constants
  1630.  
  1631. Blitz2  reserves a few variables that hold special values  known  as  system
  1632. constants.   The  following variables are reserved and  contain  the  listed
  1633. values:
  1634.  
  1635.     Pi         =    3.1415
  1636.     0n         =    -1
  1637.     0ff        =     0
  1638.     True     =     -1
  1639.     False     =    0
  1640.  
  1641. Primitive Types Summary
  1642.  
  1643. Blitz2 currently supports 6 primitive types.  Byte, Word and Long are signed
  1644. 8,  16 and 32 hit variable types. The Quick type is a fixed point type, less
  1645. accurate  than floating point but t:aster.  The Float type is  the  Floating
  1646. Point type supported by the Amiga Fast Floating Point libraries.
  1647.  
  1648. The  String  type  is  a standard BASIC implementation of  string'  variable
  1649. handling.
  1650.  
  1651. Page 23
  1652.  
  1653.  
  1654. Using  the  DetType directive.  variables can be defined  as  certain  types
  1655. without adding the relevant suffix.  Once a variable is defined as a certain
  1656. type  the  suffix  is not necessary except in the case of  string  variables
  1657. when the suffix must always be included.
  1658.  
  1659. A  variable  can only be of one type throughout the program  and  cannot  be
  1660. defined  as any other except again in the case of strings where the variable
  1661. name can ALSO be used for a numeric type.
  1662.  
  1663. NewTypes
  1664.  
  1665. In  addition to the 6 primitive types available in Blitz2,  programmers also
  1666. have available the facility to create their own custom types.
  1667.  
  1668. A NewType is a collection of fields,  similar to a record in a database or a
  1669. C  structure.  This enables the programmer to group together relevant fields
  1670. in one variable type.
  1671.  
  1672. The following code shows how fields holding a person's name,  age and height
  1673. can be assigned to one variable:
  1674.  
  1675.     NEWTYPE .Person
  1676.         name$
  1677.         age.b
  1678.         height.q
  1679.     End NEWTYPE
  1680.  
  1681.     a.Person\name= "Harry",20,2.1
  1682.  
  1683.     NPrint a\height
  1684.  
  1685. Once  a NewType is defined,  variables are assigned the new type by using  a
  1686. suffix of .NewTypename for example a.Person
  1687.  
  1688. Individual  fields within a NewType variable are accessed and assigned  with
  1689. the backslash character "\" for example: a\height=a\height+1.
  1690.  
  1691. When  defining a NewType structure,  field names without a  suffix  will  be
  1692. assigned the type of the previous field.  More than one field can be  listed
  1693. per line of a NewType definition,  they must however be separated by colons.
  1694. The following is another example of a NewType definition:
  1695.  
  1696.     NewType .nme
  1697.         x.w:y:z    ;y & z are also words (see above)
  1698.         value.w
  1699.         speed.q
  1700.         name$
  1701.     End NewType
  1702.  
  1703. References to string fields when using NewTypes do',at require the $  or  .s
  1704. suffix  as  normal string variables do,  including the suffix will  cause  a
  1705. Garbage at End of Line compile time error.
  1706.  
  1707. Page 24
  1708.  
  1709.  
  1710. From the first example:
  1711.  
  1712.     a\name="Jimi Hendrix"     ;this is cool
  1713.     a\name$="Bob Dylan"     ;this is uncool!
  1714.  
  1715. Previously  defined  NewTypes   can   be   used  within  subsequent  NewType
  1716. definitions.  The following is an example of a NewType which itself includes
  1717. another NewType:
  1718.  
  1719.     NewType .vector
  1720.         x.q
  1721.         Yq
  1722.         z.q
  1723.     End NewType
  1724.  
  1725.     NewType .object
  1726.         position.vector
  1727.         speed.vector
  1728.         acceleration.vector
  1729.     End NewType
  1730.  
  1731.     DefType .object myship ;see following paragraph!
  1732.  
  1733.     myship\position\x=1OO,O,O
  1734.  
  1735. Note  how we now need to use two backslashes to access the fields in  myship
  1736. just like a pathname in DOS.
  1737.  
  1738. A NewType,  once defined,  can be used in combination with both forms of the
  1739. DetType command just as though it was a another primitive type.
  1740.  
  1741. Arrays inside NewTypes
  1742.  
  1743. Besides including primitives and other newtypes within newtypes,  it is also
  1744. possible to include arrays inside NewTypes The square brackets  [  &  ]  are
  1745. used when defining arrays inside newtypes.
  1746.  
  1747. Unlike  normal arrays,  arrays in newtypes are limited to a single dimension
  1748. and  their  size must be dimensioned by a constant not a variable.   However
  1749. the array may be of any type including newtypes.
  1750.  
  1751. Also  unlike arrays.  the dimension size between the square brackets is  the
  1752. size of the array so addess.s[4] allocates 4 strings indexed 0..3.
  1753.  
  1754. The following is an example of using an array inside a newtype:
  1755.  
  1756.     NEWTYPE .record
  1757.         name$
  1758.         age.w
  1759.         address.s[4] ,same as address$[4]
  1760.     End NEWTYPE
  1761.  
  1762. Page 25
  1763.  
  1764.  
  1765.     DEFTYPE .record p
  1766.  
  1767.     p\address[0]="10 St Kevins Arcade"
  1768.     p\address[1]="Karangahape Road"
  1769.     p\address[2]="Auckland"
  1770.     p\address[3]="New Zealand"
  1771.  
  1772.     For i=0 To 3
  1773.         NPrint p\address[i]
  1774.     Next
  1775.  
  1776.     MouseWait
  1777.  
  1778. The  [index] can be omitted in which case the first item (item 0)   will  be
  1779. used.
  1780.  
  1781. Defining an array inside a newtype with 0 elements creates a union with  the
  1782. following field (both fields occupy the same memory in the NewType).
  1783.  
  1784. The UsePath Directive
  1785.  
  1786. Often when using complex NewTypes,  pathnames to access fields within fields
  1787. can become very long.
  1788.  
  1789. Often  a  routine wil1 be dealing only with one particular  field  within  a
  1790. newtype. By using the UsePath directive large pathnames can be avoided.
  1791.  
  1792. When  a  backslash precedes a variable or field name Blitz2 will insert  the
  1793. UsePath path definition when it compiles the program.
  1794.  
  1795. The following code:
  1796.  
  1797.     UsePath shapes(i)\pos
  1798.     For i=0 To 9
  1799.         \x+1 0
  1800.         \y+20
  1801.         \z-10
  1802.     Next
  1803.  
  1804. is expanded internally by the compiler to read:
  1805.  
  1806.     For i=0 To 9
  1807.         shapes(i)\pos\x+1 0
  1808.         shapes(i)\pos\y+20
  1809.         shapes(i)\pos\z-1 0
  1810.     Next
  1811.  
  1812. The UsePath directive can help to make routines a lot more readable and  can
  1813. save a lot of typing!
  1814.  
  1815. Note  that UsePath is a compiler directive,  this means that it affects  the
  1816. compiler  as  it reads through your program top to bottom not the  processor
  1817. when it runs your
  1818.  
  1819. Page 26
  1820.  
  1821.  
  1822. program.
  1823.  
  1824. This  means  that if a routine jumps to somewhere else in  the  program  the
  1825. UsePath  in effect will be governed by the closest previous usepath  in  the
  1826. listing.
  1827.  
  1828. ARRAYS
  1829.  
  1830. Arrays  in  Blitz2  follow normal BASIC conventions.   All  Arrays  MUST  be
  1831. dimensioned before use,  may be of any type (primitive or NewType)  and  may
  1832. be any number of dimensions.
  1833.  
  1834. All  arrays are indexed from 0..n where n is the size.  As with most BASIC's
  1835. an  array  such  as  a(50)   can actually hold  51  elements  indexed  0..50
  1836. inclusive.
  1837.  
  1838. As  with all variable definitions an array will be of default type unless  a
  1839. .type suffix is added to the array name:
  1840.  
  1841.     Dim a.w(50)    fan array of words
  1842.  
  1843. The  ability to use arrays of NewTypes often reduces the number of arrays  a
  1844. BASIC program requires.
  1845.  
  1846. The following:
  1847.  
  1848.     Dim Alienflags(1OO),Alienx(1OO),Alieny(100)
  1849.  
  1850. can be implemented with the following code:
  1851.  
  1852.     NEWTYPE .Alien
  1853.         flags.w
  1854.         x.w
  1855.         y.w
  1856.     End NEWTYPE
  1857.  
  1858.     Dim Aliens.Alien(100)
  1859.  
  1860. You may now access all of the required alien data using just one array.
  1861. To set up all of the aliens x and y entries with random coordinates
  1862.  
  1863.     For k=1 To 100
  1864.         Aliens(k)\x=Rnd(320),Rnd(200)
  1865.     Next
  1866.  
  1867. This  also makes it much easier to expand the amount of information for  the
  1868. aliens  simply  by  adding more entries to the NewType definition,   no  new
  1869. arrays are required.
  1870.  
  1871. Note:  unlike most compilers,  Blitz2 DOES allow the dimensioning of  arrays
  1872. with a variable number of elements for example:  Dim a(n).  Also strings  in
  1873. arrays  do  not  require a maximum length setting as is the case  with  some
  1874. other languages.
  1875.  
  1876. Page 27
  1877.  
  1878.  
  1879. LISTS
  1880.  
  1881. Blitz2 also supports an advanced form of the array known as the List.  Lists
  1882. are arrays, but with slightly different characteristics.
  1883.  
  1884. Often  only  a  portion of the elements in an array will  be  used  and  the
  1885. programmer  will  keep a count in a separate variable of how  many  elements
  1886. are  currently stored in the array.  In this situation the array  should  be
  1887. replaced  with  a list which will make things both simpler  and  faster  for
  1888. managing the array.
  1889.  
  1890. Dimming Lists
  1891.  
  1892. A  list  is dimensioned similar to an array except the word List is inserted
  1893. after the word Dim. Lists are currently limited to one dimension.
  1894.  
  1895. Here is an example of setting up a list:
  1896.  
  1897.     NEWTYPE.Alien
  1898.         flags.w:x:y
  1899.     End NEWTYPE
  1900.  
  1901.     Dim List Aliens.Alien(100)
  1902. The  difference  between a list and an array is that  Blitz2  will  keep  an
  1903. internal  count of how many elements are stored in the list (reset  to  zero
  1904. after a Dim List)  and an internal pointer to the current element within the
  1905. list (cleared after a Dim List).
  1906.  
  1907. Adding items to a list
  1908.  
  1909. A list starts out as empty, items can be added using the AddItem and AddLast
  1910. functions.  Because the list might be full both commands return  a  true  or
  1911. false to indicate whether they succeeded.
  1912.  
  1913. The following adds one alien to the previously dimmed list:
  1914.  
  1915.     If Additem(Aliens())
  1916.         Aliens()\x=Rnd(320),Rnd(200)
  1917.     Endif
  1918.  
  1919. Note  how  there is no index variable inside the brackets in either  use  of
  1920. Aliens().   Although Blitz2 will not flag an error when an  index  is  used,
  1921. indexes should never be used with list arrays.  The empty brackets represent
  1922. the current item in the list, in this case, the newly added item.
  1923.  
  1924. Because  AddItem  returns  false  when  the  list  is  full  we  can  use  a
  1925. While..Wend  loop  to fill an entire list with aliens  (then  kill  'em  off
  1926. slowly!):
  1927.  
  1928.     While Additem(Aliens())
  1929.         Aliens()\x=Rnd(320)
  1930.         Aliens()\y=Rnd(200)
  1931.     Wend
  1932.  
  1933. Page 28
  1934.  
  1935.  
  1936.  
  1937. The above loops until the list is full.  IS we wanted to add 20 aliens to  a
  1938. list we could use a For..Next but would still need to check if the list  was
  1939. full each time we added an alien:
  1940.  
  1941.     For i=1 To 20
  1942.         If Additem(Aliens())
  1943.             Aliens()\x=Rnd(320)
  1944.             Aliens()\v=Rnd(200)
  1945.         Endif
  1946. Next
  1947.  
  1948. Note  that  lists  can  be dimensioned to hold any  type  not  just  aliens!
  1949. (They're not just for games that is.)
  1950.  
  1951. Processing Lists
  1952.  
  1953. As  mentioned,  when an item is successfully added,  that item  becomes  the
  1954. current  item.  This current item may then be referenced by  specifying  the
  1955. list array name followed by empty brackets ( ).
  1956.  
  1957. To  process a list (loop through all the items added to a list),   we  reset
  1958. the  list pointer to the beginning using ResetList and then use the NextItem
  1959. command  to  step the pointer through the items in the list.  This  internal
  1960. pointer points to the current item.
  1961.  
  1962. The  following  moves  all the aliens in the list in  a  rather  ineffective
  1963. manner (towards the middle of the screen I suspect):
  1964.  
  1965.     USEPATH Aliens()
  1966.  
  1967.     ResetList Aliens()
  1968.  
  1969.     While Nextitem(Aliens())
  1970.         If \x>160 Then \x-1 Else \x+1
  1971.         If \y>100 Then \y-1 Else \y+1
  1972.     Wend
  1973.  
  1974. The  While Nextitem(Aliens())..Wend structure loops until each item  in  the
  1975. list  has  been the current item.  This means that any alien that  has  been
  1976. added to the list will be processed by the loop.
  1977.  
  1978. The  function NextItem returns false if the loop comes to  the  end  of  thr
  1979. list.
  1980.  
  1981. Again,  NextItem returns a true or false depending on whether there actually
  1982. is  a  next  item to be processed.  This example illustrates the convenience
  1983. lists offer over normal arrays,  no "for i= I to num" to step through arrays
  1984. using the old index method,  instead a clean While..Wend with a system  that
  1985. is faster than normal arrays!
  1986.  
  1987. PAge 29
  1988.  
  1989.  
  1990. Removing Items From a List
  1991.  
  1992. It  is  often  necessary  to  remove an item  from  a  list  while  you  are
  1993. processing it.  This may be achieved with Kililtem. This example again works
  1994. with the Aliens list:
  1995.  
  1996.     ResetList Aliens()
  1997.  
  1998.     While Nextitem(Aliens())
  1999.         If Aliens()\flags=-1 ;if flag=-1
  2000.             Killtem Aliens() ;remove item from list
  2001.         Endif
  2002.     Wend
  2003.  
  2004. Note:  after a Killtem,  the current item is set to the previous item.  This
  2005. means the While Nextitem() loop will not miss an item if an item is removed.
  2006. List Structure
  2007.  
  2008. Although  it  is  possible to access items in a list  by  treating  them  as
  2009. normal arrays with an index variable it should never be attempted.
  2010.  
  2011. The  order of items in a list is not always the same as the order  they  are
  2012. in  memory.  Each item contains a pointer to the item before  and  the  item
  2013. after.   When  Blitz2 looks for a next item it just  looks  at  the  pointer
  2014. attached  to  the  current  item,   its  physical  memory  location  is  NOT
  2015. important.  When an item is added to a list, an arbitrary memory location is
  2016. used,   the current item's NextItem pointer is changed to point to  the  new
  2017. item and its old value is given the new items Nextitem pointer.
  2018.  
  2019. Confused? Well don't worry,  just don't ever treat lists as normal arrays by
  2020. trying to access items with the index method.
  2021.  
  2022. The Pointer Type
  2023.  
  2024. The  pointer type in Blitz2 is a complex beast.  When you define a  variable
  2025. as a pointer type you also state what type it is pointing to.  The following
  2026. defines biggest as a pointer to type Customer.
  2027.  
  2028.     DefType *biggest.Customer
  2029.  
  2030. The  variable biggest is just a long word that holds a memory location where
  2031. some other Customer variable is located.
  2032.  
  2033. As  an  example  we  may have a large list of customers,  our  routine  goes
  2034. through them one by one,  if the turnover of a customer is larger  than  the
  2035. one  pointed  to  by  Biggest  then we point  Biggest  towards  the  current
  2036. customer: *biggest=CustomerArray()
  2037.  
  2038. Once  we  have  looped through the list we could print out the Biggest  data
  2039. just  as  if  it was type Customer when it is actually only a pointer  to  a
  2040. variable with type customer with Print *biggest\name.
  2041.  
  2042. Page 30
  2043.  
  2044.  
  2045. 4. PROCEDURES
  2046.  
  2047. Introduction
  2048.  
  2049. A procedure is a way of 'packaging' routines into self contained modules.
  2050.  
  2051. Once  a routine is packaged into a procedure,  it can be 'called' from  your
  2052. main code,  parameters can be passed, and an optional value returned to your
  2053. main code.
  2054.  
  2055. Because  a  procedure contains its own 'local' variable space,  you  can  be
  2056. sure  that  none of your main or 'global' variables will be changed  by  the
  2057. calling  of the procedure.  This feature means procedures are very portable,
  2058. in  effect  they  can  be  ported  to other programs  with  out  conflicting
  2059. variable name hassles.
  2060.  
  2061. Procedures that return a result are called functions in Blitz2,   ones  that
  2062. do not are known as statements.
  2063.  
  2064. Functions and Statements in Blitz2 have the following characteristics:
  2065.  
  2066. . the number of parameters is limited to 6
  2067.  
  2068. . gosubs and gotos to labels outside a procedure's code is strictly illegal
  2069.  
  2070. .  any variables used inside a procedure will be initialized with every call
  2071. Statements
  2072.  
  2073. A procedure that does not return a value is called a Statement in Blitz2.
  2074.  
  2075. Here  is  an  example  of a statement type procedure which  prints  out  the
  2076. factorial of a number:
  2077.  
  2078.     Statement fact{n}
  2079.         a=1
  2080.         For k=2 To n
  2081.             a=a*k
  2082.         Next
  2083.         NPrint a
  2084.     End Statement
  2085.  
  2086.     For k=1 To5
  2087.         fact{k}
  2088.     Next
  2089.     MouseWait
  2090.  
  2091. Note  the  use of curly brackets { and } to both define parameters  for  the
  2092. procedure,  and in calling the procedure.  These are necessary even  if  the
  2093. procedure requires no parameters.
  2094.  
  2095. If  you  type in this program,  compile and run it,  you will  see  that  it
  2096. prints out the
  2097.  
  2098. Page 31
  2099.  
  2100.  
  2101. factorials  of  the  numbers from I to 5.  You may  have  noticed  that  the
  2102. variable k has been used in both the procedure and the main code.   This  is
  2103. allowable  because  the k in the procedure is local to the  fact  procedure,
  2104. and  is  completely separate from the k in the main program.  The k  in  the
  2105. main program is known as a global variable.
  2106.  
  2107. You  may  use up to six variables to pass parameters to a procedure  If  you
  2108. require  more  than this,  extra parameters may be placed in special  shared
  2109. global variables (see Shared below).
  2110.  
  2111. Also,  variables used to pass parameters may only be of primitive types, you
  2112. cannot  pass a NewType variable to a procedure however you can pass  pointer
  2113. types.
  2114.  
  2115. Functions
  2116.  
  2117. In  Blitz2,  you may also create procedures which return a value,  known  as
  2118. functions.   The  following  is the same fact  procedure  implemented  as  a
  2119. function:
  2120.  
  2121.     Function fact{n}
  2122.         a=1
  2123.         For k=2 To n
  2124.             a=a*k
  2125.         Next
  2126.         Function Return a
  2127.     End Function
  2128.  
  2129.     For k=1 To5
  2130.         NPrint fact{k}
  2131.     Next
  2132.     MouseWait
  2133.  
  2134. Note how Function Return is used to return the result of the function.  This
  2135. is  much more useful than the previous factorial procedure,  as we  may  use
  2136. the result in any expression we want. For example:
  2137.  
  2138.     a-fact(k}*fact{j}
  2139.  
  2140. A function may return a result of any of the 6 primitive types.  To inform a
  2141. procedure  what  type  of  result  you are  wanting  to  return,   the  type
  2142. descriptor may be appended to the Function command.  If this is omitted, the
  2143. current default type will be used (normally .q):
  2144.  
  2145. The following is an example of a string function:
  2146.  
  2147.     Function$ spc{n}
  2148.         For k=1 To n
  2149.             a$=a$+" "
  2150.         Next
  2151.  
  2152.     Function Return a$
  2153.     End Function
  2154.     Print spc{20},"0ver Here!"
  2155.     MouseWait
  2156.  
  2157. Page 32
  2158.  
  2159.  
  2160.  
  2161. Recursion
  2162.  
  2163. The  memory used by a procedure's local variables is unique not only to  the
  2164. actual  procedure,   but  to each calling of the  procedure.   Each  time  a
  2165. procedure is called a new block of memory is allocated and treed  only  when
  2166. the procedure ends.
  2167.  
  2168. The  implications  of  this are that a procedure  may  call  itself  without
  2169. corrupting it's own local variables.  This allows for a phenomenon known  as
  2170. recursion.   Here is another version of the factorial procedure  which  uses
  2171. recursion:
  2172.  
  2173.     Function fact{n}
  2174.         If n>2 Then n=n*fact{n-1 }
  2175.         Function Return n
  2176.     End Function
  2177.  
  2178.     For n=1 To 5
  2179.         NPrint fact{n}
  2180.     Next
  2181.     MouseWait
  2182.  
  2183. This  example  relies  on  the concept that the factorial  of  a  number  is
  2184. actually the number multiplied by the factorial of one less than the number.
  2185. Accessing Global Variables
  2186.  
  2187. Sometimes  it  is  necessary for a procedure to access  one  or  more  of  a
  2188. programs  global  variables.  For this purpose,  the Shared  command  allows
  2189. certain variables inside a procedure to be treated as global variables.
  2190.  
  2191.     Statement example{}
  2192.         Shared k
  2193.         NPrint k
  2194.     End Statement
  2195.  
  2196.     For k=1 To5
  2197.         example{}
  2198.     Next
  2199.     MouseWait
  2200.  
  2201. The  Shared  command tells Blitz2 that the procedure should use  the  global
  2202. variable  k  instead of creating a local variable k.  Try the  same  program
  2203. with  the  Shared  removed.  Now,  the k inside the  procedure  is  a  local
  2204. variable, and will therefore be O each time the procedure is called.
  2205.  
  2206. Procedures Summary
  2207.  
  2208. Blitz2  supports two sorts of procedures,  the function and  the  statement.
  2209. Both  are able to have their own local variables as well as access to global
  2210. variables through the use of the Shared statement.
  2211.  
  2212.  
  2213. Page 33
  2214.  
  2215.  
  2216.  
  2217. Up to six values can be passed to a Blitz2 procedure.
  2218.  
  2219. A  Blitz2  function can return any primitive type using the Function  Return
  2220. commands.
  2221.  
  2222. Using Assembler in Blitz Procedures
  2223.  
  2224. Procedures also offer an excellent method of incorporating assembly language
  2225. routines into Blitz programs.
  2226.  
  2227. The  Statement  or  Function is defined as usual with a list  of  parameters
  2228. enclosed in curly brackets.  When using assembler,  the parameters passed to
  2229. the procedure are loaded in data registers DO..DS.
  2230.  
  2231. Care  must  be taken to ensure that address registers A4-A6 are restored  to
  2232. their  initial  state  before the code exits from the  procedure  using  the
  2233. AsmExit command.
  2234.  
  2235. To  set the return value in assembler for Functions simply load the register
  2236. DO with the value before the AsmExit command.
  2237.  
  2238. For an example of an assembler procedure in Blitz, turn to page 63.
  2239.  
  2240. Page 34
  2241.  
  2242.  
  2243. 5. BLITZ ERROR CHECKING AND DEBUGGING
  2244.  
  2245. Compile Time Errors
  2246.  
  2247. Blitz2  reports two types of errors.  Compile time errors  are  those  found
  2248. when  Blitz attempts to compile your code,  runtime errors occur  when  your
  2249. program is being executed.
  2250.  
  2251. The  first  type,  compile time errors,  cause a message to  appear  on  the
  2252. editor  screen.  When OK is selected you are returned to the offending  line
  2253. of code in your program.
  2254.  
  2255. Appendix 2 of the Blitz2 Reference Manual contains a description of all  the
  2256. possible  errors  at compile time.  The following list repeats  some  Blitz2
  2257. rules  that  have  to  be  abided by for your  program  to  be  successfully
  2258. compiled:
  2259.  
  2260. 1.   Any  Blitz 2 functions (commands that return a value)  must have  their
  2261.      parameters inside brackets:
  2262.  
  2263.     If ReadFile(0,"ram:test")
  2264.  
  2265. 2.    Blitz2  commands  that are not functions must not have  their  parameters
  2266.         in brackets:
  2267.  
  2268.     BitMap 0,320,256,3
  2269.  
  2270. 3.    Using a .type suffix when referring to items in a NewType will cause a
  2271.         garbage at end of line error:
  2272.  
  2273.     person\name$="Harry" ;(drop the $)
  2274.  
  2275. 4.   A numeric variable can only be one .type,  a MisMatched Type error will
  2276.  occur  if  you  attempt  to use a different .type suffix  further  down  the
  2277. program  with  the  same  variable   name  (with  the  exception  of  string
  2278. variables).
  2279.  
  2280. Of  course  there are many hundreds of mistakes that can cause your  program
  2281. to  fail to compile,  most will require a quick look in the Blitz2 Reference
  2282. Manual  to  check  syntax of a command and maybe cross reference  your  code
  2283. with one of the examples.
  2284.  
  2285. Don't forget the Help key to quickly check the syntax of a command.
  2286.  
  2287. Page 35
  2288.  
  2289.  
  2290.  
  2291. The CERR Directive
  2292.  
  2293. When  using  macros and conditional compiling you may wish to generate  your
  2294. own compile time errors.
  2295.  
  2296. The CERR directive is used to generate user defined compile-time errors. The
  2297. following  will halt the compiler and generate the message  "Should  Have  3
  2298. Parameters":
  2299.  
  2300.     CERR "Should Have 3 Parameters!"
  2301.  
  2302. See conditional compiling in Chapter 9 for more information on CERR.
  2303.  
  2304. Runtime Errors
  2305.  
  2306. Errors that occur while your program is executing are called runtime errors.
  2307. When  developing  programs  in Blitz2,  the Runtime  Error  Debugger  should
  2308. always be enabled on the Compiler Options window.  If it is not and an error
  2309. occurs the system will crash.
  2310.  
  2311. If  you  need to run your program without runtime errors enabled  for  speed
  2312. purposes  a SetErr directive should be included to stop the system crashing,
  2313. the system will then jump to the code listed after the SetErr.
  2314.  
  2315. The following line included at the top of your program is suggested:
  2316.  
  2317.     SetErr:End:End SetErr
  2318.  
  2319. Any  programs that use filehandling should always include some sort of error
  2320. trapping  to handle situations where the program cannot locate a  file,   or
  2321. the file is the wrong type.
  2322.  
  2323. Any  operating  system  based  software should  also  always  include  error
  2324. checking as Screens and Windows may fail to open due to low memory.
  2325.  
  2326. You  may  also  setup an error handler just for one section  of  code.   The
  2327. SetErr..errorhandler..End SetErr should be at the start of the  section  and
  2328. a ClrErr at the end of the section.
  2329.  
  2330. The following will flash the screen and end if LoadShapes fails:
  2331.  
  2332.     SetErr
  2333.         DisplayBeep_ 0
  2334.         End
  2335.     End SetErr
  2336.  
  2337.     LoadShapes 0,"filename"
  2338.     
  2339.     ClrErr
  2340.  
  2341. Page 36
  2342.  
  2343.  
  2344.  
  2345. The Blitz Debugger
  2346.  
  2347. If  a  runtime error occurs when a program is run from the editor the Blitz2
  2348. debugger  will be activated.  Of course RuntimeErrors must also be  enahleL1
  2349. in the compiler options requester.
  2350.  
  2351. The  debugger  will  not  be activated it there is an error-handler  already
  2352. enabled h1 the program using the SetErr command.
  2353.  
  2354. The  debugger  can  also  be  activated by using  the  CTRL/ALT  C  keyboard
  2355. combination,   clicking  on  the  "BRK gadget  of  the  debugger  window  or
  2356. including a STOP command h1 your program.
  2357.  
  2358. The  debugger  is  a  powerful tool in finding  out  causes  of  errors  and
  2359. locating bugs.  The ability to step back through code executed prior to  the
  2360. break  gives the prograrmmer an excellent understanding of how an error  has
  2361. occurred.   The follwing is a screenshot of the debugger after  the  program
  2362. encountered a STOP command.
  2363.  
  2364. Note  that by making the debugger window larger more of the program  can  be
  2365. viewed.
  2366.  
  2367. Page 37
  2368.  
  2369.  
  2370. The Debugger Gadgets
  2371.  
  2372. The following is a description of the debugger gadgets:
  2373.  
  2374. BRK 
  2375.  
  2376. Click on this to stop a program running and enable the Blitz debugger.
  2377.  
  2378. STP        Use this to stop a program during Trace mode.
  2379.  
  2380. SKP        
  2381. Skip causes the debugger to skip a command, program execution
  2382. will continue from the next command when then RUN.
  2383.  
  2384. TRC        
  2385.  
  2386. Trace  mode  allows the programmer to single step through  their  code,   by
  2387. increasing the size of the debugger window program flow can be viewed.
  2388.  
  2389. RUN        RUN causes program execution to resume after being stopped.
  2390.  
  2391. <<        
  2392.  
  2393. View  previous command history allows the programmer to review the  commands
  2394. that were executed prior to the program being stopped.
  2395.  
  2396. >>        
  2397.  
  2398. View  forward  allows the user to forward through the command history  after
  2399. using the view previous gadget.
  2400.  
  2401. EXC        
  2402.  
  2403. Execute  allows  the  programmer to manually enter a  Blitz  command  to  be
  2404. executed by the debugger.
  2405.  
  2406. EVL     
  2407.  
  2408. Evaluate allows the programmer to view any variable simply by entering  it's
  2409. name after clicking on EVL.
  2410.  
  2411. Tracing program execution
  2412.  
  2413. The  debugger  allows  the  user to single step  through  or  trace  program
  2414. execution,   displaying  in it's window which  command  is  currently  being
  2415. executed.
  2416.  
  2417. Step  is  used to single step through your program,  each time you click  on
  2418. STP the debugger will execute the command pointed to by the arrow and stop.
  2419.  
  2420. Trace  steps  continuously through the code displaying each  command  as  it
  2421. goes. To stop the Trace use the STP gadget.
  2422.  
  2423. Level  is  used  to  change the trace level,  if Level is toggled  on,   the
  2424. debugger  will  not  trace or single step through the  inside  of  For..Next
  2425. loops but execute normally until the loop exits.
  2426.  
  2427. It  will  also  not  trace  the execution of any procedures  or  subroutines
  2428. called,  this is most useful for watching the program's main loop while  not
  2429. having to sit through the trace of each subroutine when called.
  2430.  
  2431. Page 38
  2432.  
  2433.  
  2434. Resuming Normal Execution
  2435.  
  2436. Program execution can return normally after the debugger is activated  using
  2437. the Run gadget.
  2438.  
  2439. If  the  debugger  was activated using the STOP command the  arrow  will  be
  2440. pointing  to  the STOP,  before continuing the command must be skipped  over
  2441. using  the Ignore command.  This is true for any command that has  caused  a
  2442. RunTime error and invoked the debugger.
  2443.  
  2444. To  return  to  the editor from the debugger either hit the  Escape  key  or
  2445. click on the close window gadget of the debugger Window.
  2446.  
  2447. Viewing command history
  2448.  
  2449. The  debugger keeps a record of the commands executed before the program  is
  2450. stopped in a large buffer.
  2451.  
  2452. The  Back-up  command  will step backwards from where  the  program  halted,
  2453. allowing  the  programmer  to view the previous  commands  executed  by  the
  2454. computer. A hollow arrow marks the current position in the history buffer.
  2455.  
  2456. The  Forward  command is used to step forwards through the  history  buffer,
  2457. attempting to step past where the program was stopped will produce a AT  END
  2458. OF BUFFER error.
  2459.  
  2460. These features are invaluable to following through program execution  up  to
  2461. where  the  program was halted.  If a program halted  in  the  middle  of  a
  2462. subroutine  or  procedure you can step backwards to find where  the  routine
  2463. was called from.
  2464.  
  2465. Direct Mode
  2466.  
  2467. While  the  debugger is activated the programmer has two tools available  to
  2468. examine the internal state of the program.
  2469.  
  2470. To find out the value of any variables the EVaLuate command can be used.   A
  2471. prompt  will  appear,   after typing the name of the  variable  and  hitting
  2472. return the value will be printed on the debugger display.
  2473.  
  2474. The  EXeCute command is used to run a Blitz2 command.  A prompt will  appear
  2475. and the programmer can then type in any Blitz2 command such as CLS or n=2().
  2476.  
  2477. Page 39
  2478.  
  2479.  
  2480. Debugger Errors
  2481.  
  2482. The  following errors may occur when using the direct mode commands Evaluate
  2483. and eXecute:
  2484.  
  2485.     Can't Create in Direct Mode
  2486.  
  2487. Occurs  if you try and Evaluate a variable that does not exist (hasn't  been
  2488. created) in the program.
  2489.  
  2490.     Library Not Available in Direct Mode
  2491.  
  2492. Occurs  when a Blitz2 command is eXecuted and is from a command library  not
  2493. used by the program.  If the program does not use strings for instance,  the
  2494. string  command  library will not be part of the  object  code  and  so  any
  2495. string type commands will not be able to be eXecuted.
  2496.  
  2497.     Not Enough Room in Direct Mode Buffer
  2498.  
  2499. This  error should never occur.  if it does the object butter  size  in  the
  2500. Compiler Options requester should be increased.
  2501.  
  2502.     AT END OF BUFFER
  2503.  
  2504. Occurs  if the programmer tries to view Forward of where the program stopped
  2505. (see viewing command history).
  2506.  
  2507. Page 40
  2508.  
  2509.  
  2510. 6. BLITZ OBJECTS
  2511.  
  2512. Blitz2 Objects Overview
  2513. This  chapter  covers  the use and handling of Blitz2  objects,   structures
  2514. designed  to  control  multiple system elements such  as  graphics,   files,
  2515. screens etc.
  2516.  
  2517. Blitz2 looks after all memory requirements for objects including freeing  it
  2518. up when the program ends.
  2519.  
  2520. Although  most objects have their own specific commands,  the  standard  way
  2521. they  are handled in Blitz2 means the programmer is never faced with unusual
  2522. syntax.   Instead they can depend on a standard modular way  of  programming
  2523. the multitude o elements available in Blitz2.
  2524.  
  2525. The following is a list of the main Blitz2 objects:
  2526.  
  2527. Files            for sequential and random access DOS file handling
  2528. Modules            soundtracker compatible music objects
  2529. Blitzfonts        8x8 fonts for fast BitMap text output
  2530. IntuiFonts        any size fonts for Window text output
  2531. Shapes            standard Blitz2 graphics element
  2532. Palettes        colour palette structure
  2533. BitMaps            standard Blitz2 display element
  2534. Sounds            digitised sound sample element
  2535. Sprites            Blitz mode hardware sprite element
  2536. Screens            standard Intuition type screens
  2537. Windows            standard Inuition type windows
  2538. Gadgets            standard Intuition type gadgets
  2539. Menus            standard Intuition type menus
  2540.  
  2541. Object Similarities
  2542.  
  2543. Blitz2 objects all have a set of commands allowing the program to create  or
  2544. define them, manipulate and of course destroy them.
  2545.  
  2546. Most  objects have a chapter in the Blitz2 reference manual devoted to them,
  2547. outlining all the special commands used to create and manipulate the object.
  2548. All  Blitz2 objects can be destroyed using the Free command.  If  an  object
  2549. has  not been destroyed when a program ends,  Blitz2 will automatically Free
  2550. that object.
  2551.  
  2552. Free  BitMap 0 will free up all memory allocated for object BitMap 0,   this
  2553. is  useful when using objects temporarily and will need the memory later  in
  2554. the  program,   otherwise  it is usual to let Blitz2  free  up  all  objects
  2555. automatically when the program
  2556.  
  2557. Page 41
  2558.  
  2559.  
  2560.  
  2561. ends.
  2562.  
  2563. Object Maximums
  2564.  
  2565. Each object has its own maximum. this number defines how many of one type of
  2566. object  can be created and manipulated by the program.  The maximum  can  be
  2567. changed for each object in the Compiler Options window of the editor.
  2568.  
  2569. The runtime error Value Out Of Maximum Range means you have tried to use  an
  2570. object  number greater than that set in the maximums window of the  Compiler
  2571. Options.
  2572.  
  2573. Using an Object
  2574.  
  2575. Many  commands need previously created objects present to operate  properly.
  2576. For  example,   the Blit command,  which is used to place  a  shape  onto  a
  2577. bitmap, needs both a previously created shape object and a bitmap object.
  2578.  
  2579. When  you use the Blit command,  you specify the shape object to be  blitted
  2580. and Blitz will blit that shape onto the currently used bitmap.
  2581.  
  2582.     Use BitMap 0 ;make bitmap the currently used bitmap
  2583.     Blit 3,10,10    ;blit shape 3 onto currently used bitmap
  2584.  
  2585. The  Use  command in the previous example makes BitMap 0 the currently  used
  2586. bitmap.  Screens,  Windows and Palettes are three other Blitz2 objects  that
  2587. often need to be currently used, for commands to work properly.
  2588.  
  2589. It should also be noted that when an object is created,  it also becomes the
  2590. currently used object of it's class.
  2591.  
  2592. Blitz2  makes  extensive  use  of this currently  used  object  idea.   It's
  2593. advantages include faster program execution,  less complex looking commands,
  2594. and greater program modularity.
  2595.  
  2596. Page 42
  2597.  
  2598.  
  2599. Input/Ouput Objects
  2600.  
  2601. BitMap,   File  and  Window objects can all operate  as  1/0  devices.   The
  2602. ObjectInput  and ObjectOutput commands allow the user to channel  input  and
  2603. output to different places.
  2604.  
  2605. The Print command will always write to the current output object,  edit  and
  2606. inkey$ will always attempt to read from the current input object.
  2607.  
  2608.     WindowOutput 2; window 2 is the current output object
  2609.     Print "HELLO"
  2610.     BitMapinput 1 ;make bitmap 1 the current input object
  2611.     a$=Edit$(80)
  2612.  
  2613. Object structures (for advanced users)
  2614.  
  2615. Appendix I of the Blitz2 reference manual contains descriptions of  each  of
  2616. the  Blitz2  object's structures.  The Addr command  is  used  to  find  the
  2617. location in memory of a particular objects structure.
  2618.  
  2619. Advanced  users  can  use the Addr command with peek  and  poke  and  inline
  2620. assembler  routines  to  access important values in an  object's  structure.
  2621. This  is  often helpful with system type objects such as Screens and Windows
  2622. that contain pointers to their Intuition counterparts.
  2623.  
  2624. The  following  calls  the  system   command  ScreenToFront_  obtaining  the
  2625. location of the Inuition Screen structure from the Blitz2 Screen  object  in
  2626. memory.
  2627.  
  2628.     ScreenToFront_ Peek.l(Addr Screen(0))
  2629.  
  2630. This  next  listing  illustrates obtaining a Window's system  structure  and
  2631. assigning  it to a pointer type .Window.  AmigaLibs.Res should  be  resident
  2632. before running this example.
  2633.  
  2634.     FindScreen 0
  2635.     Window 0,10,10,100,100,9,"SIZE ME!",1,2
  2636.     *w.Window=Peek. I(Addr Window(0))
  2637.     WindowOutput 0
  2638.     Repeat
  2639.         ev.l=WaitEvent
  2640.         WLocate 0,0
  2641.         NPrint *w\Width
  2642.         NPrint *w\Height
  2643.     Until ev=$200
  2644.  
  2645. Note:  the NewType.Window refers to the system (Intuition)  window structure
  2646. where as the NewType .window refers to the Blitz2 window structure.
  2647.  
  2648. Page 43
  2649.  
  2650.  
  2651. Overview of the primary Blitz2 Objects
  2652.  
  2653. Screens
  2654.  
  2655. Screens  are  created using the Screen and FindScreen commands.   The  first
  2656. will  open  a  new  screen  while the second will make  an  existing  Screen
  2657. (usually the WorkBench screen) a Blitz2 Screen.
  2658.  
  2659. Free  Screen n should only be attempted after any Windows open on the Screen
  2660. are closed (freed) first.
  2661.  
  2662. Screen  objects both configure the resolution of the display and its palette
  2663. as  well  as being the place where Windows are opened.  Any Windows  opened,
  2664. RGB or UsePalette commands will use the currently used screen.
  2665.  
  2666. The  function Peek.l(addr Screen(n))  can be used to obtain the location  of
  2667. the system .Screen structure when calling system routines.
  2668.  
  2669. Windows
  2670.  
  2671. Windows  are created with the Window command.  Gadgets and menus are  always
  2672. added  to  the  currently  used  window while the  drawing  commands  WPlot,
  2673. WCircle, WLine and WBox all render to the currently used Window.
  2674.  
  2675. Window  objects  can  be  used for input/output using  the  WindowInput  and
  2676. WindowOuput commands.  The cursor position for input/ouput can be controlled
  2677. with the WLocate command.
  2678.  
  2679. Windows  can  be freed without the worry of freeing any attached  gadget  or
  2680. menulists.
  2681.  
  2682. Gadget and Menu lists
  2683.  
  2684. Gadgets and menus must be grouped together in Blitz objects known  as.   yes
  2685. you guessed it,  gadgetlists and menulists.  These lists are attached  to  a
  2686. Window  when the window is first created (opened).  This means that  gadgets
  2687. and  menus  should all be pre-defined in their lists at  the  start  of  the
  2688. program.
  2689.  
  2690. Palettes
  2691.  
  2692. A  palette  object contains RGB information for each of  the  colours  in  a
  2693. display.   Palettes are a little different to regular Blitz objects  in  the
  2694. following ways.
  2695.  
  2696. Use  Palette  will  set the current screen or slice to the  colours  in  the
  2697. palette.
  2698.  
  2699. The RGB command as well as the Red(),  Green() and Blue() functions apply to
  2700. the colours in the current Slice or Screen NOT in the current palette.
  2701.  
  2702. There  is  no  create palette command,  they are either created when  loaded
  2703. from  an  IFF  file or when using PalRGB,  if no palette object exists  with
  2704. either command Blitz2 will create one.
  2705.  
  2706. Page 44
  2707.  
  2708.  
  2709. BitMaps
  2710.  
  2711. A  bitmap refers to the array of pixels that make up the display.  A  bitmap
  2712. can  either be created with the BitMap command,  loaded from disk or fetched
  2713. from a Screen using the ScreensBitMap command.
  2714.  
  2715. A  Bitmap command can be freed using the Free BitMap n command,  you can not
  2716. free bitmaps created with the ScreensBitMap command.
  2717.  
  2718. As  with  windows,  bitmaps can be used as input/ output  devices  with  the
  2719. BitMapInput  and  BitMapOutput   commands.   These  are  used  primarily  in
  2720. BlitzMode.
  2721.  
  2722. In  BlitzMode  the  keyboard  should be enabled  with  BlitzKeys  On  before
  2723. attempting to use BitMapInput.
  2724.  
  2725. When  using  BitMapOutput the Locate command can be  used  to  position  the
  2726. cursor.
  2727.  
  2728. Shapes
  2729.  
  2730. Shapes  are  used  to contain graphic images.  They can  be  initialized  by
  2731. either  loading them from disk or being clipped from a bitmap  object  using
  2732. the GetAShape command.
  2733.  
  2734. Shapes are freed using the standard Free Shape n syntax.  Shapes should  not
  2735. be  freed  if  they are used with gadgets or menu items until  the  relevant
  2736. gadget or menulist is freed first.
  2737.  
  2738. There  are  many powerful commands in Blitz2 to manipulate shapes  including
  2739. rotation and scaling.
  2740.  
  2741. Sprites
  2742.  
  2743. Sprites  are  initialized by either loading them from disk or  converting  a
  2744. shape object to a sprite object using GetaSprite.  The shape object  can  be
  2745. freed once it has been converted to a sprite.
  2746.  
  2747. Free Sprite n will free a sprite
  2748.  
  2749. Sprites can currently only be used in Blitz mode however in Amiga mode,  the
  2750. pointer can be assigned to a single sprite object.
  2751.  
  2752. Slices
  2753.  
  2754. A  slice is used to configure a display in Blitz mode.  They are initialised
  2755. with the Slice command.
  2756.  
  2757. Unlike other objects,  single slices cannot be freed.  FreeSlices is used to
  2758. free all slices currently initialised.
  2759.  
  2760. The commands Show, ShowF, ShowB and ShowSprite all use the currently used
  2761.  
  2762. Page 45
  2763.  
  2764.  
  2765. slice.   The RGB command also affects the colour registers in the  currently
  2766. used slice as does the Use Palette command.
  2767.  
  2768. Files
  2769.  
  2770. Unlike  other  Blitz2  objects  files are  opened  and  closed  rather  than
  2771. initialised and killed.
  2772.  
  2773. Files  are  initialised  with the OpenFile(),  ReadFile()   and  WriteFile()
  2774. functions.   Unlike other Blitz2 objects a function is used so  the  program
  2775. can tell if the file was successfully opened.
  2776.  
  2777. The  CloseFile n command is used to 'free' a file object.  The command  Free
  2778. File n may also be used,  unlike other objects it is best to close all files
  2779. yourself rather than rely on Blitz2 to close them when the program exits.
  2780.  
  2781. A  file  is  of  course an input/output object,  the commands FileInput  and
  2782. FileOutput are used to direct input and output to files.
  2783.  
  2784. Get,   Put,  ReadMem and WriteMem require file# parameters  and  so  do  not
  2785. require the use of FileInput and FileOutput commands.
  2786.  
  2787. Objects Summary
  2788.  
  2789. Blitz2's objects are custom data structures used by the libraries to  handle
  2790. a whole assortment of entities.  Blitz2 manages the memory required by these
  2791. structures, freeing them automatically when a program ends.
  2792.  
  2793. They provide a simple interface to many of the more complex Blitz2 commands.
  2794. Parameter  passing  is  minimised  as  many  of  the  Blitz2  commands  take
  2795. advantage of the currently used object.
  2796.  
  2797. As  libraries are upgraded and added to Blitz2,  more objects will be  added
  2798. and versatility and functionality of existing objects will be increased.
  2799.  
  2800. Page 46
  2801.  
  2802. 7. BLITZ MODE
  2803.  
  2804.  
  2805. Introduction to Blitz Mode
  2806.  
  2807. Although  the  Amiga's operating system is very powerful,  it's  ability  to
  2808. take  full  advantage of the graphics capacity of the  machine  is  limited.
  2809. Blitz  mode  is for programmers wanting to produce smooth animated  graphics
  2810. for games and the like.
  2811.  
  2812. The  command Blitz puts your program in Blitz mode.  When this  happens  the
  2813. operating system is disabled and your program takes over the whole  machine.
  2814. This  means  that  it  will  not multi-task and file  access  is  no  longer
  2815. possible.
  2816.  
  2817. The  benefits of Blitz mode are that programs run a lot quicker and  display
  2818. options such as smooth scrolling and dual-playfield are possible.
  2819.  
  2820. Blitz mode is not a permanent state,  when your program re-enters Amiga mode
  2821. or  exits,   the operating system is brought back to life as though  nothing
  2822. happened.
  2823.  
  2824. Careful attention must be payed regarding entering Blitz mode,  version  1.3
  2825. and  older  of the operating system can take up to 2 seconds  to  flush  any
  2826. buffers after a file is closed.  You should always ensure that absolutely no
  2827. disk or file access is taking place before entering Blitz mode.  At the time
  2828. of  this  writing,   no  software method of  achieving  this  has  yet  been
  2829. discovered.   The best we can suggest is that a VWAIT 100 should  always  be
  2830. executed before using Blitz mode.
  2831.  
  2832. Slice Magic
  2833.  
  2834. The  designers  of  the Amiga hardware have implemented  many  features  for
  2835. acheiving smooth,  fast graphics.  After entering Blitz mode the display  is
  2836. controlled  using Slices.  Slices are much more flexible than the  operating
  2837. system's  Screens,   they allow features such as smooth  scrolling,   double
  2838. buffered displays and much more.
  2839.  
  2840. The  ability to have more than one slice means that the display can be split
  2841. into different regions each with their own resolution.
  2842.  
  2843. The  following is a description of the main display features accessible with
  2844. slices:
  2845.  
  2846. Page 47
  2847.  
  2848.  
  2849. Smooth Scrolling
  2850.  
  2851. Smooth  scrolling  is  acheived by displaying only  a  portion  of  a  large
  2852. bitmap.  The Amiga hardware enables us to move the display window around the
  2853. inside of a large bitmap as the following diagram shows:
  2854.  
  2855. The display window represents what is shown on the monitor,  as we move  the
  2856. display  window  across the bitmap to the right the  image  we  see  on  the
  2857. screen scrolls smoothly to the left.
  2858.  
  2859. The Blitz commands Show, ShowF and ShowB allow us to set the position of the
  2860. display window inside the bitmap.
  2861.  
  2862. The  above  diagram  limits the amount we can scroll  to  the  size  of  the
  2863. bitmap.  By duplicating the left portion of the bitmap on the right  we  can
  2864. smoothly scroll the display across,  and when it reaches the right, reset it
  2865. back  to  the far left.  As there is no change when the display is reset  to
  2866. the left the illusion of continuous scrolling is created.
  2867.  
  2868. The  above  left  right scenario also applys to vertical scrolling  (up  and
  2869. down).
  2870.  
  2871. Dual-Playfield
  2872.  
  2873. In  some  situations,  the display will be made up of  a  background  and  a
  2874. foreground.  The Amiga has the ability to display one bitmap on top  of  the
  2875. other called dual- playfield mode to achieve this effect.
  2876.  
  2877. In  a  dual-playfield display,  two 8 colour bitmaps can be displayed,   one
  2878. infront of the
  2879.  
  2880. Page 48
  2881.  
  2882.  
  2883. other,   any  pixels  set  to colour zero in the  front  playfield  will  be
  2884. transparent  letting the back playfield show through.   Each  playfield  can
  2885. have its own colours.
  2886.  
  2887. Copper Control
  2888.  
  2889. Smooth  animation  is acheived by moving graphics in  sync  with  the  video
  2890. display.   The  display is created by a video beam that redraws  the  screen
  2891. line by line every 50th of a second.  Often,  it is useful to sync things to
  2892. the  vertical  position of the vertical beam.  This is  acheived  using  the
  2893. Amiga graphics co-processor known as the Copper.
  2894.  
  2895. Blitz2 offers several ways of taking advantage of the copper hardware.   The
  2896. most  popular  is to change the colour of the background colour  to  produce
  2897. rainbow  type effects on the display.  This is acheived using  the  ColSplit
  2898. command.
  2899.  
  2900. Those  with  a good knowledge of the Amiga hardware may wish to program  the
  2901. copper  to  make other changes at different vertical places,   this  can  be
  2902. acheived using the CustomCop command.
  2903.  
  2904. The Blitter
  2905.  
  2906. The  Amiga has custom hardware specifically to transfer graphic images  onto
  2907. bitmaps known as the glitter.  Blitz2 offers several ways of blitting shapes
  2908. onto  a  bitmap  and a special Scroll command to shift  areas  of  a  bitmap
  2909. around using the blister.
  2910.  
  2911. The  following is a brief overview of the various blister based commands  in
  2912. Blitz2:
  2913.  
  2914. Blit     used to put shapes onto bitmaps.
  2915.  
  2916. QBlit     
  2917.  
  2918. same as Blit but Blitz2 remembers where the shape was put and will erase  it
  2919. when it is time to move the shape somewhere else on the bitmap.
  2920.  
  2921. BBlit
  2922.  
  2923. same as QBlit but when it is time to move the shape,  instead of erasing the
  2924. shape, Blitz2 replaces what was on the bitmap previous to the BBlit.
  2925.  
  2926. SBlit
  2927.  
  2928. sames as Blit but with a stencil feature which protects certain areas of the
  2929. bitmap from being blitted on.
  2930.  
  2931. Block
  2932.  
  2933. fast  version of Blit that works only with rectangular shapes a multiple  of
  2934. 16 pixels wide.
  2935.  
  2936. Page 49
  2937.  
  2938.  
  2939. ClipBlit Slow version of Blit which will clip the shape to fit inside the bimap.
  2940.  
  2941. Scroll used to copy sections of a bitmap from one position to another.
  2942.  
  2943. QAmiga Mode
  2944.  
  2945. It  is  also  possible to jump out of Blitz mode and back into  Amiga  mode.
  2946. This can done using either the QAmiga or Amiga statement.
  2947.  
  2948. Using  Amiga to go back into Amiga mode will fully return you to the Amiga's
  2949. normal display, complete with mouse pointer.
  2950.  
  2951. Using QAmiga will return you to Amiga mode,  but will not affect the display
  2952. at  all.  This allows your Blitz mode programs to jump into Amiga  mode  for
  2953. operations such as file I/O,  then to jump back to Blitz mode without having
  2954. to destroy a Blitz mode display.
  2955.  
  2956. An Important note!!!!!
  2957.  
  2958. You  should always ensure that absolutely no disk or file access  is  taking
  2959. place before entering Blitz mode.  At the time of this writing,  no software
  2960. method of achieving this has yet been discovered.
  2961.  
  2962. By following these guidelines using Blitz mode should be pretty safe:
  2963.  
  2964. .   Always wait for the floppy drive light to go out if you have saved  some
  2965. source  code before Compiling/Running a program which launces straight  into
  2966. Blitz mode.
  2967.  
  2968. .   A590  Hard drive users - always wait for the second blink of  the  drive
  2969. light when using Workbench 1.3,  2.0 users have there buffers flushed in one
  2970. go.
  2971.  
  2972. .   If you use the QAmiga statement for the purpose of writing data to disk,
  2973. it's  a  good idea to execute a delay before going back to Blitz mode  -  In
  2974. effect,  simulating the above. Executing a VWait 250 will provide a delay of
  2975. about five seconds - a safe delay to use. After reading data use a VWait 50.
  2976. Another  important thing to remember about Blitz mode is that  any  commands
  2977. requiring  the  presence  of the operating system become  unavailable  while
  2978. you're in Blitz mode.  For example, if you attempt to open a Window in Blitz
  2979. mode,   you will be greeted with an 'Only available in Amiga Mode' error  at
  2980. compile  time.  For this reason,  the Reference Guide clearly  states  which
  2981. commands are available in which mode.
  2982.  
  2983. The Blitz,  Amiga,  and QAmiga statements are all compiler directives.  This
  2984. means they must appear in applicable order in your source code.
  2985.  
  2986. Summary
  2987.  
  2988. Page 50
  2989.  
  2990.  
  2991. Blitz2 provides two environments for your programs to execute in. Amiga mode
  2992. should  be  used for any applications software and whenever your game  needs
  2993. to  load  data  from disk.  Blitz mode is for programs  that  need  to  take
  2994. advantage  of  the special display modes we have provided in Blitz2.   These
  2995. provide  performance that is just not available in Amiga mode but will  halt
  2996. the Amiga's operating system.
  2997.  
  2998. To conclude,  the only time it is acceptable to close down the Amiga's multi
  2999. tasking environment is when the software is dedicated to entertainment.  any
  3000. applications  software that uses Blitz mode will  NOT  be  welcomed  by  the
  3001. Amiga community.
  3002.  
  3003. Page 51
  3004.  
  3005.  
  3006. 8. ADVANCED TOPICS
  3007.  
  3008. Resident Files
  3009.  
  3010. To  make writing programs which manipulate large number of NewTypes,  macros
  3011. or constants easier, Blitz2 includes a feature known as resirlentfiles.
  3012.  
  3013. A  resident  file  contains a pre-compiled list  of  NewTypes,   macros  and
  3014. constants.  By creating resident files, all these definitions can be dropped
  3015. from the main code making it smaller and taster to compile.
  3016.  
  3017. To  create  a resident file you will need a program which contains  all  the
  3018. NewTypes.  macros and constants you want to convert to resident file format.
  3019. The following is an example of a such a program:
  3020.  
  3021.     NEWTYPE.test
  3022.         a.l
  3023.         b.w
  3024.     End NEWTYPE
  3025.  
  3026.     Macro mac
  3027.         NPrint "Hello"
  3028.     End Macro
  3029.  
  3030.     xconst= 1 0
  3031.  
  3032. Now,  to convert these definitions to a resident file, all you need to do is
  3033. COMPILE&RUN the program, then select CREATE RESIDENT from the COMPILER menu.
  3034. At  this point,  you will be presented with a file requester into which  you
  3035. enter the name of the resident file you wish to create.  That's all there is
  3036. to creating a resident file!
  3037.  
  3038. Once  created,   a resident file may be installed in any program  simply  by
  3039. entering the name of the resident file into one of the 'RESIDENT' fields  of
  3040. the compiler options requester.  Once this is done,  all NewType,  macro and
  3041. constant  definitions contained in the resident file will  automatically  be
  3042. available.
  3043.  
  3044. The resident file AMIGALIBS.RES contains all the structures,  constants  and
  3045. macros  associated  with the Amiga operating system.   Those  familiar  with
  3046. programming  the operating system will find not having to  include  all  the
  3047. usual library header files will save minutes every compile time.
  3048.  
  3049. Page 53
  3050.  
  3051.  
  3052. Operating System Calls
  3053.  
  3054. Much effort has been made to let the Blitz2 programmer make the most of  the
  3055. Amiga's powerful operating system.
  3056.  
  3057. Calling Operating System Libraries
  3058.  
  3059. Often  the  programmer  with a good knowledge of the Operating  System  will
  3060. want  to  access  routines that have not been supported  by  the  'internal'
  3061. Blitz2 command set.  All routines in the Exec,  Intuition,  DOS and Graphics
  3062. libraries  are  accessible  from  Blitz2  (see  appendix  5  in  the  Blitz2
  3063. Reference Manual).
  3064.  
  3065. Support  for  other Amiga standard libraries is available by purchasing  the
  3066. Blitz2 advanced programmers pack from Acid Software.
  3067.  
  3068. The  following is an example of calling routines in the Amiga ROM's graphics
  3069. and intuition libraries:
  3070.  
  3071. FindScreen 0                    ;use workbench screen
  3072.  
  3073. ;open gimmezerozero window
  3074.  
  3075. Window 0,0,10,320,180,$408,"",1,2
  3076. rp.l=RastPort(0)            ;get rastport for window
  3077. win.l=Peek.l(Addr Window(0))        ;find window structure
  3078.  
  3079. DrawEllipse_rp, 100,100 ,-50,50        ;graphics library
  3080. MoveWindow_win,8,0            ;intuition library
  3081. BitMap 1,320,200,2            ;setup work bitmap
  3082. Circlef 160,100,100,1            ;draw something
  3083.  
  3084. ;then transfer it to window
  3085.     
  3086. BltBitMapRastPort_ Addr BitMap(1),0,0, rp,0,0, 1 0O, 1 00,$c0
  3087.     
  3088. WaitEvent
  3089.  
  3090. The  final  command  BltBitMapRastPort_  is  very  useful  for  transferring
  3091. graphics drawn with the faster bitmap based Blitz2 commands onto  a  Window.
  3092. This is a very system friendly way of acheiving this objective.
  3093.  
  3094. Page 54
  3095.  
  3096.  
  3097. Accessing Operating System structures
  3098.  
  3099. With  the  file  AMIGALIBS.RES resident (see start of  chapter)   even  more
  3100. control of the operating system is possible.  The following is an example of
  3101. accessing operating system structures.
  3102.  
  3103.     ;variable *exec points to the ExecBase struct
  3104.     ;variable *mylist points to a List type
  3105.     ;variable *mynode points to a system node
  3106.  
  3107.     *exec.ExecBase=Peek.1(4)
  3108.     *mylist. List=*exec\LibList
  3109.     *mynode.Node=*mylist\lh_Head
  3110.  
  3111.     While*mvnode\ln_Succ
  3112.         a$=Peek$(*mynode\1n_Name);print node name
  3113.         NPrint a$
  3114.         *mvnode=*mvnode\ln_Succ:qo to next node
  3115.     Wend
  3116.  
  3117.     MouseWait
  3118.  
  3119. The  use of the asterisk in *variablename.type means that instead of  Blitz2
  3120. creating  a variable of a certain type it actually just creates a  'pointer'
  3121. to that type.  The type (structure) can then be accessed just like it was an
  3122. internal Blitz2 variable.
  3123.  
  3124. The  command  Peek$  is an excellent way of retrieving text  from  operating
  3125. system  structures,  it reads memory directly into a Blitz2 string  variable
  3126. until it hits a null (chr$(0)).
  3127.  
  3128. Locating Variables and Labels in Memory
  3129.  
  3130. The ampersand ('&')  character can be used to find the address of a variable
  3131. in the Amiga's memory. For example:
  3132.  
  3133.     ;
  3134.     ; An example of using '&' to find the address of a var.
  3135.     ;
  3136.     Var.l=5
  3137.     Poke. I &Var, 10
  3138.     NPrint Var
  3139.     MouseWait
  3140.  
  3141. This is similar to the VarPtr function supplied in other BASIC's.
  3142.  
  3143. When  asking for the address of a string variable,  the returned value  will
  3144. point to the first character of the string.  The length of the string is a 4
  3145. byte value, located at the address-4.
  3146.  
  3147. The '?' character can be used to find the address of a program label in  the
  3148. Amiga's
  3149.  
  3150. Page 55
  3151.  
  3152.  
  3153. memory. For example:
  3154.  
  3155.     ;
  3156.     ;An example of finding the address of a program label
  3157.     ;
  3158.     MOVE #1 0,There            ;wo! assembly code on this line
  3159.     NPrint Peek.w(?There)
  3160.     MouseWait
  3161.     End
  3162.     ;
  3163.     There:Dc.w 0            ;wo! and again here
  3164.  
  3165. These  features  are really only of use to programmers  with  some  assembly
  3166. language experience who need unconventional means for their ends.
  3167.  
  3168. Constants
  3169.  
  3170. A 'constant',  in BASIC programming terms,  is a value which does not change
  3171. throughout the execution of a program. The 5 in a=5 is a constant.
  3172.  
  3173. A  hash  sign  (#)  before a variable name means that it is a  constant  (no
  3174. longer a variable!)  and cannot change in value when the program is running.
  3175. #width=320 means the variable #width is a constant and will always be  equal
  3176. to 320.
  3177.  
  3178. Constants have the following properties:
  3179.  
  3180. . are faster than variables and do not require any memory
  3181.  
  3182. . make programs more readable than using numbers
  3183.  
  3184. . can be used in assembler
  3185.  
  3186. . can be used with conditional compiling evaluations
  3187.  
  3188. . can only hold integer values
  3189.  
  3190. . make it easier to change a constant amount used throughout a program
  3191.  
  3192. . can be altered through the source at compile time but NOT at runtime
  3193.  
  3194. The  most  important aspect of constants from a BASIC programmers  point  of
  3195. view  is that any 'magic numbers' that appear throughout their code  can  be
  3196. replaced by meaningful words such as #width.
  3197.  
  3198. If the program ever has to be modified to work with a new width,  instead of
  3199. going through all the source changing any mention of the numbers '320',  the
  3200. programmer  can just change the constant equate at the top  of  the  program
  3201. #width=320 to #width=640 etc.
  3202.  
  3203. Page 56
  3204.  
  3205. Conditional Compiling
  3206.  
  3207. Conditional  compiling allows the programmer to switch the compiler  on  and
  3208. off  as  it reads through the source code,  controlling which parts  of  the
  3209. program are compiled and which are not.
  3210.  
  3211. Conditional  compiling  is useful for producing different  versions  of  the
  3212. same software without using two different source codes.  It can also be used
  3213. to  cripple a demo version of the software or produce different programs for
  3214. different hardware configurations.
  3215.  
  3216. Tracking  down  bugs can also involve the use of conditional compiling,   by
  3217. turning  off any unnecessary parts of the code it becomes easier to pinpoint
  3218. where  exactly the error is occurring.  However we hope the Blitz2  debugger
  3219. will make this practice obsolete.
  3220.  
  3221. The conditional compiler directives are as follows:
  3222.  
  3223. CNIF     -compiler on if numeric comparison is true, off otherwise
  3224. CSIF     -compiler on if string comparison is true, off otherwise
  3225. CELSE     -switch compiler from previous state on=>off off=>on
  3226. CEND     -end of conditional block (restores previous state)
  3227.  
  3228. The compiler has an internal on/off switch,  after a CNIF or CSIF comparison
  3229. the compiler switches on for true,  off for false.  A CELSE will toggle  the
  3230. compiler  switch and the CEND will restore the on/off state to that  of  the
  3231. previous CNIF/CSIF.
  3232.  
  3233. CNIF/CEND blocks can be nested.
  3234.  
  3235. It is important to remember that the CNIF directive only works with constant
  3236. parameters - for example,  '5',  '#test' - and not with variables.  This  is
  3237. because  Blitz2 must be able to evaluate the comparison when it is  actually
  3238. compiling, and variables are not determined until a program is actually run.
  3239.  
  3240. The following code illustrates using conditional compiling:
  3241.  
  3242.     #crippled=] ;is a crippled version
  3243.  
  3244.     NPrint "Goo Goo Software (c)1993"
  3245.  
  3246.     CNIF #crippled=]
  3247.         NPrint "DEMONSTRATION VERSION"
  3248.     CELSE
  3249.         NPrint "REGISTERED VERSION"
  3250.     CEND
  3251.     ;
  3252.     ; and later on in the program...
  3253.     ;
  3254.     .SaveRoutine
  3255.     CNIF #crippled=0;only if not crippled
  3256.     ;
  3257.     ;do save routine
  3258.     ;
  3259.     CEND
  3260.  
  3261. Page 57
  3262.  
  3263.  
  3264.     Return
  3265.  
  3266. The  benefit over using a straight If crippled=O..EndIf is that the crippled
  3267. version  of  the above code will not contain the saveroutine in  the  object
  3268. code so that there is no way it can be un-crippled by hackers.
  3269.  
  3270. The  conditional compiler directives however come into their own when  doing
  3271. macro programming.
  3272.  
  3273. Macros
  3274.  
  3275. Macros  are  a  feature  usually only found in  Assemblers  or  lower  level
  3276. programming languages.  They can be used to save typing,  to replace  simple
  3277. procedures  with  faster 'inline' versions,  or at their  most  powerful  to
  3278. generate code that would be impractical to represent with normal code.
  3279.  
  3280. A  macro  is defined in a Macro name..End Macro structure.  The code between
  3281. these  two  commands  is not compiled but placed in the  compiler's  memory.
  3282. When  the compiler reaches a !macroname it then inserts the code defined  in
  3283. the macro at this point of the source code.
  3284.  
  3285. The following code:
  3286.  
  3287.     Macro mymacro
  3288.         a=a+1
  3289.         NPrint "Good Luck"
  3290.     End Macro
  3291.  
  3292.     NPrint "Silly Example v1.0"
  3293.     !mymacro
  3294.     !mymacro
  3295.     MouseWait
  3296.  
  3297. is expanded internally by the the compiler to read:
  3298.  
  3299.     NPrint "Silly Example v1.0"
  3300.         a=a+1
  3301.         NPrint "Good Luck"
  3302.         a=a+1
  3303.         NPrint "Good Luck"
  3304.     MouseWait
  3305.  
  3306. Page 58
  3307.  
  3308.  
  3309. Macro Parameters
  3310.  
  3311. To  make things a little more useful,  parameters can be passed in  a  macro
  3312. call  using  the squigly brackets { and ).  These parameters,   are  firstly
  3313. inserted into the macro text,  then the macro text is inserted into the main
  3314. code.
  3315.  
  3316. When  a  macro is defined the use of the back apostrophe (above the TAB  key
  3317. on the Amiga keyboard)  before a digit or letter ( 1-9, a-z) marks the point
  3318. where a parameter will be inserted
  3319.  
  3320. The following illustrates passing two parameters to a macro:
  3321.  
  3322.     Macro distance
  3323.         Sqr('1 *'1 +'2*'2)
  3324.     End Macro
  3325.  
  3326.     NPrint !distance{20,30}
  3327.  
  3328.     MouseWait
  3329.  
  3330. the compiler expands the nprint line to read:
  3331.     
  3332.     NPrint Sqr(20*20+30*30)
  3333.  
  3334. replacing every 'I with the first parameter and '2 with the second etc.
  3335.  
  3336. If  there  are  more than 9 parameters letters are used:  'a signifying  the
  3337. tenth parameter 'b the eleventh and so on.
  3338.  
  3339. Parameters can be any text,  the { 20,30 } could just as easily been { x,y )
  3340. in the previous example.
  3341.  
  3342. Note:   when passing complex expressions as parameters care should be  taken
  3343. to make sure parenthesis are correct:
  3344.  
  3345.     !distance{x*1 0+20,(y*1 0+20)}
  3346.  
  3347. will expand to
  3348.     
  3349.     Sqr(x*1 0+20*x*1 0+20+(y*1 0+20)*(y*10+20)}
  3350.  
  3351. The  above  does  not  expand correctly for the  first  half.   Due  to  the
  3352. parenthesis  around  the  second  parameter  the  second  half  does  expand
  3353. properly.
  3354.  
  3355. Page 59
  3356.  
  3357. The 'O Parameter
  3358.  
  3359. The 'O parameter is special,  it returns the number of parameters passed  to
  3360. the  macro.  This is useful for both checking to see that the correct number
  3361. of  parameters  was  passed as well as generating  macros  that  can  handle
  3362. different numbers of parameters.
  3363.  
  3364. The  following  macro  checks  to  see if two  parameters  were  passed  and
  3365. generates a compile time error if there was not:
  3366.  
  3367.     Macro Vadd
  3368.     CNIF '0=2
  3369.         '1='1+'2
  3370.     CELSE
  3371.         CERR "Illegal number of '!Vadd' Parameters"
  3372.     CEND
  3373.     End Macro
  3374.  
  3375.     !Vadd{a}
  3376.  
  3377. If  you  compile  and run this program,  you will see that it  generates  an
  3378. appropriate error message when '!Vadd{a)' is encountered.  The CERR compiler
  3379. directive  is  a special directive used to generate a custom  error  message
  3380. when a program is compiled.
  3381.  
  3382. Recursive Macros
  3383.  
  3384. Macros  are  recursive and can call themselves,  the following macro  prints
  3385. the  first  parameter  and then calls itself,  minus  the  first  parameter,
  3386. effectively  stepping through the list of parameters  passed  until  a  null
  3387. character (no parameter) is reached.
  3388.  
  3389.     Macro dolist ;list upto 16 variables
  3390.         NPrint '1
  3391.         CSIF "'2">""
  3392.         !dolistt'2,'3,'4,'5,'6,'7,'8,'9,'a,'b,'c,'d,'e,'f,'g}
  3393.         CEND
  3394.     End Macro
  3395.     !dolist {a,b,c,d,e,f,g,h,i}
  3396.     MouseWait
  3397.  
  3398. Page 60
  3399.  
  3400.  
  3401. Replacing Functions with Macros
  3402.  
  3403. Macros are an excellent replacement for functions that do not use any  local
  3404. variables but need to generate more than one return variable.  The following
  3405. macro  project takes x,  y,  z coordinates and projects them onto a  2D  x,y
  3406. plane. It can then be used to generate x,y projections for drawing.
  3407.  
  3408.     Macro project #xm+'I *9-'2*6,#ym+'1 *3+'2*(i-'3*7:End Macro
  3409.  
  3410.     #xm=320:#ym=256
  3411.  
  3412.     Screen 0,28:ScreensBitMap 0,0
  3413.  
  3414.     For z=-1 5 To 1 5
  3415.         For y=-15 To 15
  3416.             Forx=-15To15
  3417.                 Circlef !project{x,y,z},3,x&y&z
  3418.             Next
  3419.         Next
  3420.  
  3421.     Next
  3422.  
  3423.     MouseWait
  3424.  
  3425. The CMake Character
  3426.  
  3427. A  special  character known as the cmake character can be used  to  evaluate
  3428. constant expressions and insert the literal result into your code.  This can
  3429. be  very  useful for generating label and variable names when a  combination
  3430. of  macro parameters and constant settings are needed to generate the  right
  3431. label.
  3432.  
  3433.     vaR=20
  3434.     var3=30
  3435.  
  3436.     Macro Ivar
  3437.         NPrint var~'1~
  3438.     End Macro
  3439.  
  3440.     !Ivar(2+1 }
  3441.  
  3442.     MouseWait
  3443.  
  3444. The  above example without the cmake characters ~ would print the  value  21
  3445. as  Blitz2  would  expand  the the code after the  NPrint  to  read  var2+1,
  3446. instead  it  evaluates  the  expression between  the  cmake  characters  and
  3447. generates a 3 which it then inserts into the macro text.
  3448.  
  3449. Page 61
  3450.  
  3451. Inline Assembler
  3452.  
  3453. It  is  possible to include 68000 machine code inside Blitz2 programs  using
  3454. the  inline  assembler.  This offers the experienced  programmer  a  way  of
  3455. speeding  up  their  programs  by replacing  certain  routines  with  faster
  3456. machine code equivalents.
  3457.  
  3458. There are three methods of including assembler in Blitz2:
  3459.  
  3460. . in line using the GetReg and PutReg commands to access variables
  3461.  
  3462. . inside statements and functions
  3463.  
  3464. . developing custom Blitz2 libraries
  3465.  
  3466. GetReg & PutReg
  3467.  
  3468. The  GetReg and PutReg commands allow the assembly programmer access to  the
  3469. BASIC  variables in the program.  The following listing illustrates the  use
  3470. of GetReg and PutReg:
  3471.  
  3472.     a.w=5            ;use words
  3473.     b.w=10
  3474.     GetReg dO,a        ;value of a=>dO
  3475.     GetReg d1 ,b    ;value of b=>dl
  3476.     MULU dO,d1
  3477.     PutReg dl ,c.w     ; value of dl=>c
  3478.     NPrint c
  3479.     MouseWait
  3480.  
  3481. The  next  example inverts the first bitplane of bitmap  0.   Note  how  any
  3482. complex  expression can be used after a GetReg command.  Because GetReg  can
  3483. only use data
  3484. registers, we place the location of the bitmap structure in dO and then move it to aO.
  3485.  
  3486.     Screen 0,3
  3487.     ScreensBitMap 0,0
  3488.     While Joyb(O)=0
  3489.         VWait 1 5
  3490.         Gosub inverse
  3491.     Wend
  3492.     End
  3493.  
  3494.     inverse:     ;memory location of bitmap struct=>dO
  3495.         GetReg dO,Addr BitMap(O)
  3496.         MOVE.I dO,aO
  3497.         MOVEM (aO),dO-d1
  3498.         MULU dO,d1
  3499.         LSR. 1#2,d 1
  3500.         SUBQ#1,d1
  3501.         MOVE.I 8(aO),aO
  3502.     loop:
  3503.         NOT.I (aO)+
  3504.         DBRA    d1,loop
  3505.  
  3506. Page 62
  3507.  
  3508.  
  3509.  
  3510.     Return
  3511.  
  3512. Using Assembler with Procedures
  3513.  
  3514. A  more efficient method of using assembler in Blitz2 is to put machine code
  3515. routines  inside  functions  and statements.  Parameters  are  automatically
  3516. placed  in d0-d5 and if using functions,  the value in register dO  will  be
  3517. returned to the calling routine.
  3518.  
  3519. The  following  listing  illustrates the use of  assembler  in  a  statement
  3520. qplot{}  which  sets a pixel on the first bitplane of the  bitmap  supplied.
  3521. Note  how more than one assembly instruction can be used per line of  source
  3522. code.
  3523.  
  3524.     Statement qplot{bmap.l,x.w,y.w}
  3525.  
  3526.         MOVE.I dO,aO:MULU (aO),d2
  3527.         MOVE.I 8(aO),aO:ADD.I d2,aO
  3528.         MOVE dl,d2:LSR#3,d2:ADD d2,aO:BSET.b d1,(aO)
  3529.         AsmExit
  3530.     End Statement
  3531.  
  3532.     Screen 0,1
  3533.     ScreensBitMap 0,0
  3534.     bp.l=Addr BitMap(O)
  3535.     For y.w=0 To 199
  3536.         For x.w=0 To 319
  3537.             qplot{bp,x,y}
  3538.         Next
  3539.     Next
  3540.     MouseWait
  3541.  
  3542. Programmers wanting to develop their own libraries of machine code  routines
  3543. should  purchase  the Blitz2 advanced programmers pack from  Acid  Software.
  3544. Blitz2  contains an extremely powerful library system giving the experienced
  3545. machine  code  programmer a highly productive and  powerful  environment  to
  3546. develop advanced software.
  3547.  
  3548. Page 63
  3549.  
  3550.  
  3551. 9. PROGRAMMING TECHNIQUE & OPTIMIZING
  3552.  
  3553. Label and Variable Names
  3554.  
  3555. The  following are rules that must be conformed to when using  variable  and
  3556. label names in Blitz2.
  3557.  
  3558. . names can be of any length
  3559.  
  3560. . they must start with a letter (a..z, A..Z) or an underscore
  3561.  
  3562. . must only contain alphanumeric chars and underscores
  3563.  
  3564. . must not start with the same letters as any Blitz2 command
  3565.  
  3566. Also,   label  and  variable names in Blitz2 are  always  treated  as  case-
  3567. sensitive,   this  means that the variables myship and MyShip  are  entirely
  3568. different.
  3569.  
  3570. Style
  3571.  
  3572. There  are  many  variable  and  label   naming  approaches  that  can  make
  3573. programming much easier.  The following are a few guidelines that  can  help
  3574. keep  things  in  control as your program grows in size and  more  and  more
  3575. variables and labels are in use.
  3576.  
  3577. Consistency is essential,  if you use any of the following styles,  stick to
  3578. them.
  3579.  
  3580. By  separating different groups of variables and labels with  the  following
  3581. methods, names can have added meaning.
  3582.  
  3583. . full caps "NAME", inital cap "Name" and lower case "name"
  3584.  
  3585. . letters "l", words "Loop" and double words "MainLoop"
  3586.  
  3587. . initial underscore "_loop" and mid underscores "main_loop"
  3588.  
  3589. . numeric suffixes such as "loop!", "loop2" etc.
  3590.  
  3591. Nomenclature  is  a  personal  this by sticking  to  a  certain  style  with
  3592. variable and label names many problems with debugging can be avoided.  Using
  3593. good  names for everything can make your program far more readable and  wild
  3594. greatly aid in finding mistakes.
  3595.  
  3596. Page 65
  3597.  
  3598. Common naming related problems
  3599.  
  3600. The  following is a summary of certain problems that can arise when variable
  3601. and label names become messy.
  3602.  
  3603. Using  the wrong variable name will often not flag an error.  If it has  not
  3604. previously been assigned,  Blitz2 will create a new variable with a  default
  3605. value  of  zero.   Avoiding a mix of different naming  styles  will  greatly
  3606. reduce these mistakes.
  3607.  
  3608. Forgetting  variable names can slow program development,  by  using  logical
  3609. names and keeping a list of your main variables on a scrap of paper next  to
  3610. your keyboard helps keep things organised.
  3611.  
  3612. Using  lengthy  names can aid readability,  however it  will  also  increase
  3613. incidents of typing errors and slow development.
  3614.  
  3615. Use  of rude or obscene labels can make programming a little more enjoyable,
  3616. however it should be avoided if your source code will be read by others.
  3617.  
  3618. Remarks and Comments
  3619.  
  3620. Unlike  other BASIC's that use the REM statement,  Blitz2 uses the semicolon
  3621. character.   Any text after a semicolon on a line will  be  ignored  by  the
  3622. Blitz2 compiler. This feature is used to document programs.
  3623.  
  3624. Adding  remarks,  the programmer can document each routine in a program  for
  3625. future reference.  One of the main curses of programming is having to return
  3626. to  a  section of code developed earlier only to find you can not make  head
  3627. or tail of its logic.
  3628.  
  3629. Although it can seem a little tedious,  adding accurate explanations of each
  3630. routine as you write it will save many headaches later.
  3631.  
  3632. A section of documentation at the top of programs is also useful,  copyright
  3633. information,   lists of bugs fixed and when as well as full descriptions  of
  3634. all main variables should all be maintained at the top of your program.
  3635.  
  3636. Page 66
  3637.  
  3638.  
  3639. Structured programming techniques
  3640.  
  3641. The  main technique in developing structured programs is a method  known  as
  3642. indenting.  Indenting means that instead of each line being flush  with  the
  3643. left  margin,  spacing is inserted at the start of the line to  'indent'  it
  3644. across the page.
  3645.  
  3646. Indenting  lines  of code that are 'nested' inside loops  or  other  program
  3647. flow  structures creates a useful aid in visualizing the structure  of  your
  3648. source code.
  3649.  
  3650. The  Blitz2 editor has several features for indenting code.  The tab key  is
  3651. used  to  move the cursor across the page.  By changing the tab  setting  in
  3652. Ted's defaults requester the size of indent can be altered.
  3653.  
  3654. By highlighting a block of code,  block tab and untab (Amiga [ and Amiga  ])
  3655. will move the whole block left or right.
  3656.  
  3657. Shift cursor left will move the cursor to the same indent as the line above.
  3658. Keeping things modular
  3659.  
  3660. There  is nothing more valuable than good initial planning when it comes  to
  3661. developing software.  Breaking down your project into modular pieces  before
  3662. you start is a must to avoid the creation of huge spaghetti nightmares.
  3663.  
  3664. After  deciding on how each section of the program is going to  function  it
  3665. is  usually  best  to start with the most difficult sections.   Getting  the
  3666. hardest  bits  going first while the program is small  can  save  a  lot  of
  3667. headaches in the long run.
  3668.  
  3669. Time  spent  waiting  for  your program to compile  &  initialize  compounds
  3670. itself  when you are bug hunting or making small adjustments  to  a  certain
  3671. section of code.  In these situations it is usually best to remove the  code
  3672. from  the main program,  spend an hour writing a shell that you can test  it
  3673. in and then set about making it bullet proof.
  3674.  
  3675. A few things to keep in mind when developing routines:
  3676.  
  3677. . snake sure it will handle all possible situations called for
  3678.  
  3679. . convince yourself you are using the most efficient method
  3680.  
  3681. . keep it modular i.e. the routine must return to where it was called
  3682.  
  3683. . keep it well documented
  3684.  
  3685. . include comments regarding global variables and arrays it uses
  3686.  
  3687. . make sure it's bullet proof (won't fall over with bad parameters)
  3688.  
  3689. . indent nested code and limit lengths of lines to aid readability
  3690.  
  3691. Page 67
  3692.  
  3693.  
  3694. Along the way...
  3695.  
  3696. Besides keeping routines well documented it is always a good idea to keep  a
  3697. piece  of  paper handy to jot down the important bits.  Lists  of  variables
  3698. that  are  common  between  routines as well as  things  still  'to  do'  in
  3699. unfinished routines should always be written down.
  3700.  
  3701. The  'to  do' list is always a good way of thinking out all the problems  in
  3702. advance.   Always  keep  in  mind what extra  routines  will  be  needed  to
  3703. implement the next one on the list.
  3704.  
  3705. One  of  the  biggest mistakes a programmer can make is to start  a  routine
  3706. that  needs all sorts of other routines to function.  By starting  with  the
  3707. standalone/ independent bits you can make sure they are working.  This keeps
  3708. you  well  clear  of  the  headaches caused where  you  have  just  added  5
  3709. routines,  tested none of them and are trying to find a bug which  could  be
  3710. located in any one of them.  Developing a modular approach to programming is
  3711. definately the most effective way of finishing a piece of software.
  3712.  
  3713. Keeping your code readable.
  3714.  
  3715. Keeping  your  code readable is next on the list of requirements  that  will
  3716. aid in the completion of a piece of software.
  3717.  
  3718. The  two main keys to readability are indenting nested code and keeping  the
  3719. amount of code on one line to a minimum.
  3720.  
  3721. The following is an illustration of indenting nested code:
  3722.  
  3723.     If ReadFile (0,"phonebook.data")
  3724.         Filelnput 0
  3725.         While NOT Eof(0)
  3726.             If Additem(people())
  3727.                 For i=0 To #num-1
  3728.                 \info[i]=Edit$(1 28)
  3729.                 Next
  3730.             Endif
  3731.         Wend
  3732.     Endif
  3733.  
  3734. This  method  means  that it is very easy to see at a glance  what  code  is
  3735. being  executed  inside  each  structure.  Using  this  method  it  is  very
  3736. difficult  to  make  a  mistake like leaving out the  terminating  EndIf  or
  3737. Wend's  as  just by finding the line above at the same level of  indentation
  3738. we can match up each Wend with it's corresponding While etc.
  3739.  
  3740. Page 68
  3741.  
  3742. Optimising Code
  3743.  
  3744. It  is always important to have a firm grasp on how much time is being taken
  3745. by certain routines to do certain things.  The following are a few things to
  3746. keep  in  mind  when  trying to get the best performance  from  your  Blitz2
  3747. programs.
  3748.  
  3749. Performance  is  most  Important with arcade type  games  where  a  sluggish
  3750. program will invariably destroy the playability of the game.  However, it is
  3751. also  important in applications and other types of software to  keep  things
  3752. as  efficient as possible.  Anything that makes the user wait  will  detract
  3753. from the productivity of the package in general.
  3754.  
  3755. Algorithms
  3756.  
  3757. The  most  Important  key to optimising different routines  is  the  overall
  3758. approach  taken to implementing them in the first place.  There will  always
  3759. be  half  a dozen ways of approaching a problem giving half a dozen possible
  3760. solutions.   In programming,  it is usually best to pick the  solution  that
  3761. will produce the result in the quickest time.
  3762.  
  3763. Loops
  3764.  
  3765. When  looking for ways to optimise a routine the best place to start  is  to
  3766. examine  the  loops (for..next,  while..wend etc.).  The time  it  takes  to
  3767. perform  the  code  inside a loop is multiplied by the number  of  times  it
  3768. loops.   This may seem rather logical but often programmers will equate  the
  3769. number of lines of code in a routine to the time taken to execute it.
  3770.  
  3771. The code:
  3772.  
  3773.     For i=1 to 100
  3774.         Nprint "hello"
  3775.     Next
  3776.  
  3777. Will take exactly the same amount of time as typing:
  3778.  
  3779.     For i=1 to 1
  3780.         Nprint "hello"
  3781.     Next
  3782.  
  3783. one hundred times, which will equate to 300 lines of code!
  3784.  
  3785. Once one can visualize loops expanded out,  the notion that if anything  can
  3786. be removed from inside a loop to before or after the loop then DO IT!
  3787.  
  3788. Page 69
  3789.  
  3790.  
  3791. Lookup tables
  3792.  
  3793. Replacing  numeric  functions with look up tables is  an  effective  way  of
  3794. gaining excellent speed increases.  A look up table or LUT for short,  is an
  3795. array  that  contains all the possible solutions that the  numeric  function
  3796. would be expected to provide.
  3797.  
  3798. The  most common example of using LUPs for healthy speed increases  is  when
  3799. using  trig  functions such as Sine or Cosine.  Instead of calling  the  Sin
  3800. function,  an array containing a sine wave is created, the size of the array
  3801. depends on the accuracy of the angle parameter in your program.
  3802.  
  3803. If  a was an integer variable containing an angle between 0 and 360 we could
  3804. replace  any  Sin  functions such as x=Sin(a* I t3()/pi)   with  x=siniup(a)
  3805. which  will  of course be more than 10 times as quick.  The array  would  be
  3806. setup in the program initialisation as follows:
  3807.  
  3808.     Dim siniup(360)
  3809.     For i=0 To 360
  3810.         sin|up(i)=Sin(i*1 80/pi)    
  3811.     Next
  3812.  
  3813. Using Pointers
  3814.  
  3815. When doing many operations on a particular subfield in a NewType a temporary
  3816. pointer  variable  of the same subfield type can be created  and  that  used
  3817. instead of the larger (and slower) path name:
  3818.  
  3819.     UsePath a(i)\alien\pos
  3820.  
  3821. replaced by:
  3822.  
  3823.     UsePath *a
  3824.     *a.pos=a(i)\alien
  3825.  
  3826. Testing Performance
  3827.  
  3828. Often  it  is  important to test two different routines to see which  offers
  3829. the faster solution.  The easiest way is to call each of them 5000 times  or
  3830. so and time which is quicker by hand.
  3831.  
  3832. When  writing arcade games that will be performing a main loop  each  frame,
  3833. it  is  useful  to poke the background colour register before  and  after  a
  3834. specific routine to see how much of the frame it is using.
  3835.  
  3836. Page 70
  3837.  
  3838.  
  3839. The following will show how much of a frame it takes to clear a bitmap:
  3840.  
  3841.     While JoyB(0)=0
  3842.         VWait
  3843.         CLS
  3844.         move #$fOO,$dff180        ;poke background colour red
  3845.     Wend
  3846.  
  3847. Different  colours  can  be  used for different  parts  of  the  main  loop.
  3848. Remember that at the top of each slice the background colour will be reset.
  3849.  
  3850. Optimising Games
  3851.  
  3852. A  quality arcade game should always run to a 50th,  meaning the  main  loop
  3853. always takes less than a frame to execute and so animation etc.  are changed
  3854. every frame giving the game that smooth professional feel.
  3855.  
  3856. This  time  frame means the programmer will often have to sacrifice  certain
  3857. elements in the game and maybe reduce colours and size of shapes to get  the
  3858. main loop fast enough.
  3859.  
  3860. The following are several methods for optimising code main loops in games:
  3861.  
  3862. Disable Runtime Errors in the compiler options when testing speed of code as
  3863. the error checker slows code dramatically.
  3864.  
  3865. Poke  the  background  colour register with different  values  between  main
  3866. routines to work out which ones are taking too long:
  3867.  
  3868.     MainLoop:
  3869.         VWait
  3870.         Gosub movealiens
  3871.         move.w #$f00,$dff180        ;turn background red
  3872.         Gosub drawaliens
  3873.         move.w #$f00,$dff180     ;turn background green
  3874.  
  3875. .    Use  QBlits  if  possible  as  they are the fastest  way  of  implementing
  3876. animated graphics in Blitz2.
  3877.  
  3878. .    If  aliens change direction using complex routines,  split up  the  aliens
  3879. into  groups  and  every  frame  select a  different  group  to  have  their
  3880. directions changed,  the others can move in the same direction until  it  is
  3881. their  turn.  This method applies to any routines that do not have to happen
  3882. every frame but can be spread across several frames in tidy chunks.
  3883.  
  3884. .    Decrease the size of the display.  During a frame,  the display slows down
  3885. the  processor and blister.  A smaller display increases the amount of  time
  3886. given to the processor and blister.
  3887.  
  3888. There  is  an infinite number of ways to increase the speed of Blitz2  code.
  3889. subscribing  to Blitz User Magazine is one of the best ways of  speeding  up
  3890. your code!
  3891.  
  3892. Page 71
  3893.  
  3894.  
  3895. Those  developing  games  on machines with fast mem  and  faster  processors
  3896. should remember that most people do not have either!  It is a good  idea  to
  3897. disable fastmem when testing the speed of your code.
  3898.  
  3899. Page 72
  3900.  
  3901.  
  3902. 10. PROGRAM EXAMPLES
  3903.  
  3904. Number Guessing
  3905.  
  3906. The  following is a small program where the computer guesses a random number
  3907. and you have to guess it in less than ten turns.
  3908.  
  3909.     NPrint "I just picked a number from O to 100"
  3910.     NPrint "I'll give you ten turns to guess it:"
  3911.  
  3912.     a=Rnd(1 00)
  3913.     n=1
  3914.     
  3915.     Repeat
  3916.         Print "Attempt #",n," ?"
  3917.         b=Edit(1 O)
  3918.         If b=a Then NPrint "Lucky Guess":Goto finish
  3919.         If b<a Then NPrint "Too Small"
  3920.         If b>a Then NPrint "Too Large"
  3921.         n+1
  3922.     Until n=11
  3923.  
  3924.     NPrint "Out of turns!"
  3925.  
  3926.     finish:
  3927.  
  3928.     NPrint "Press mouse button to exit."
  3929.     MouseWait
  3930.  
  3931. First  up,  you'll find it pretty hard to guess the number,  this is because
  3932. the  number  Blitz2 generates is not by default an integer  and  will  hence
  3933. include some fractional part.
  3934.  
  3935. Change the line a=Rnd(100) to either a.w=Rnd(100) or a=Int(Rnd(100)).
  3936.  
  3937. The  .w  suffix  means the variable a is now a word type  (an  integer  with
  3938. range - 32768..32767).  If you use the Int function in the second option,  a
  3939. is still a quick type but the random number has its fractional part chopped.
  3940. When  you use variables in Blitz2 without a.type suffix they default to  the
  3941. quick  type  which  is  a  number  with  range  -32768..32767  with  1/65536
  3942. accuracy.   See the Variable Types section for a more indepth discussion  of
  3943. this topic.
  3944.  
  3945. Page 73
  3946.  
  3947.  
  3948. If  you want all the variables in the program to default to the integer word
  3949. type, not quick then add the following line to the top of the program:
  3950.  
  3951. DEFTYPE .w fall variables without suffix default to words
  3952.  
  3953. As  with  other BASICs once the variable is used once.  it s type is defined
  3954. and future references do not require the .type suffix.
  3955.  
  3956. Unlike other BASICs the Print command does not move the cursor to a new line
  3957. when finished, the command NPrint is used for this.
  3958.  
  3959. The Edit() function is used instead of the older input command.
  3960.  
  3961. Also the semicolon is used instead of the REMark command in Blitz2 and  does
  3962. not retain any of it's older functionality in Print statements.
  3963.  
  3964. Creating a standalone Workbench program
  3965.  
  3966. The  number guessing program can be made to run from Workbench with its  own
  3967. icon. Add the following lines to the start of your code.
  3968.  
  3969. The  text  after  the semicolons are known as remarks,  as  mentioned,   the
  3970. semicolon in Blitz2 replaces the old REMark command in older BASICs.
  3971.  
  3972. ; Number Guessing Program
  3973.  
  3974. WBStartup  ,necessary for prog to be run from WorkBench  FindScreen  O  ;get
  3975. front most Intuition screen ; Window 0,0,0,320,210,$1000,"Hello World",1,2
  3976.  
  3977. When  you compile&execute the program now,  the window replaces the  default
  3978. CLI for input and output.
  3979.  
  3980. One thing that you should replace is the b=Edit(10) function to:
  3981.  
  3982. b=Val(Edit$(10))
  3983.  
  3984. This gets rid of the default 0 character that appears in the window form  of
  3985. the Edit() function.
  3986.  
  3987. Ensure the Create Executable Icon option in the Compiler Options is  set  to
  3988. ON.
  3989.  
  3990. Now,   select  Create Executable from the compiler Menu or  use  the  AmigaE
  3991. keyboard shortcut.
  3992.  
  3993. Type the name of the program you wish to create and hit return. You have now
  3994. created your first stand alone program with Blitz2,  go to the Workbench and
  3995. click on the new program's icon to test it.
  3996.  
  3997. Page 74
  3998.  
  3999. A Graphic Example
  4000.  
  4001. The  following program opens its own screen and draws what  is  known  as  a
  4002. rosette,  a pattern where lines are connected between all the points  around
  4003. a circle.
  4004.  
  4005. ;
  4006. ;rosette example
  4007. ;
  4008.  
  4009. n=20
  4010.  
  4011. NEWTYPE .pt
  4012.     x.w:y
  4013. End NEWTYPE
  4014.  
  4015. Dim p.pt(n)
  4016.  
  4017. For i=0 To n-1
  4018.     p(i)\x=320+Sin(2*i*Pi/n)*31 9
  4019.     p(i)\y=256+Cos(2*i*Pi/n)*255
  4020. Next
  4021.  
  4022. Screen 0,25 , hires 1 colour interlace screen
  4023. ScreensBitMap 0,0
  4024.  
  4025. For i1=0 To n-2
  4026.     For i2=i1+1 To n-1
  4027.         Line p(i1 )\x,p(i1 )\y,p(i2)\-x,p(i2)\y,1
  4028.     Next
  4029. Next
  4030.  
  4031. MouseWait
  4032.  
  4033. The  NewType .pt defined in the program has two items or fields x & y.  This
  4034. means that instead of dimming an array of x.w(n)  and y.w(n)  we can dim one
  4035. array of p.pt(n) which can hold the same information.
  4036.  
  4037. The  backslash "\" character is used to access the separate  fields  of  the
  4038. newtype.  The first For..Next loop assigns the points of a circle  into  the
  4039. array of points.
  4040.  
  4041. The  ScreensBitMap command allows us to draw directly onto the  screen  with
  4042. the Plot,  Line,  Box and Circle commands.  Programs that use windows should
  4043. not  use  this method,  rather they should draw into specific windows  using
  4044. the WPlot, WLine WBox and WCircle commands.
  4045.  
  4046. Page 75
  4047.  
  4048. Using Menus and the Blitz2 File Requester
  4049.  
  4050. The  following program opens its own screen & window,  attaches a menu list,
  4051. and  depending  on what the user selects from the menus,  either  opens  the
  4052. Blitz2 file requester or exits.
  4053.  
  4054. ; A Simple File Requester example
  4055.  
  4056. Screen 0,11,"Select A Menu"        ;open our own intuition screen
  4057.  
  4058. MenuTitle O,O,"Project"            ;setup a menu list
  4059. Menultem O,O,O,O,"Load ","L"
  4060. Menultem 0,0,0,1,"Save ","S"
  4061. Menultem 0,0,0,2,"Quit ","Q"
  4062.  
  4063. MaxLen path$=1 92     ;MUSTbe executed before a file requester is used
  4064. MaxLen name$=192
  4065.  
  4066. ;Set up a BACKDROP (ie - invisible) window
  4067. Window 0,0,0,320,200,$1900,"",1,2
  4068. WLocate 0,20             ;move cursor to top left of window
  4069. SetMenu 0             ;attach our menu list to our window
  4070.  
  4071. Repeat
  4072.     Select WaitEvent
  4073.         Case 256 fits a menu event!
  4074.             Select ItemHit
  4075.     
  4076.             Case 0        ;load,its item 0 which means load
  4077.             p$=FileRequest$("FileToLoad",path$, name$)
  4078.             NPrint "Attempted to Load ",p$
  4079.     
  4080.             Case 1         ;save fits item 1 which means save
  4081.             p$=FileRequest$(" FileToSave",path$, name$)
  4082.             NPrint "Attempted to Save ",p$
  4083.     
  4084.             Case 2        ;its item 2 which means quit
  4085.                 End
  4086.  
  4087.         End Select
  4088.     End Select
  4089. Forever
  4090.  
  4091. The  MaxLen  command is used to allocate a certain amount of  memory  for  a
  4092. string  variable  in  Blitz2.  This is necessary  so  that  the  two  string
  4093. variables  required by the file requester command are large enough  for  the
  4094. job.
  4095.  
  4096. The menus created by the MenuTitle and Menultem commands are attached to the
  4097. Window using the SetMenu command.
  4098.  
  4099. Page 76
  4100.  
  4101. The  Select..Case..End  Select structures  are  the  best  way  of  handling
  4102. information  coming from a user.  When the user selects a  menu,   closes  a
  4103. window,  clicks on a gadget an 'event' is sent to your program.  Usually  an
  4104. application program will use the WaitEvent command.  which makes the program
  4105. 'sleep' until the user does something.  When multitasking,  a progran1  that
  4106. is 'asleep' will not slow down the execution of other programs running.
  4107.  
  4108. Once  an  event is received,  the event code returned by WaitEvent specifies
  4109. what  type  of an event occurred.  A menu event returns 256 ($100  hex),   a
  4110. close window event returns 512 ($200 hex).  A full list of events and  their
  4111. IDCMP codes is listed on page 25-5 of the Blitz2 reference manual.
  4112.  
  4113. String Gadgets
  4114.  
  4115. The  following program demonstrates the use of string gadgets.  These  allow
  4116. the  user  to enter text via the keyboard.  The following sets up  3  string
  4117. gadgets for decimal, hex and binary input/output.
  4118.  
  4119. When  the user types a number into one of the gadgets and hits return,   the
  4120. program  receives  a gadgetup event.  The GadgetHit function  returns  which
  4121. gadget  caused  the event.  The program then converts the  number  the  user
  4122. typed  into the other number systems (decimal,  hex or binary)  and displays
  4123. the results in each of the string gadgets.
  4124.  
  4125. The  ActivateString command means the user does not need  to  click  on  the
  4126. gadget to reactivate it so that they can type in another number.
  4127.  
  4128. ;
  4129. ;decimal hex binary converter
  4130. ;
  4131.  
  4132. FindScreen O
  4133.  
  4134. StringGadget 0,64,12,O,O,18,144
  4135. StringGadget O,64,26,O,1,18,144
  4136. StringGadget O,64,4O,O,2,18,144
  4137.  
  4138. Window O,10O,5O,22O,56,$1008,"BASE CONVERTER",1,2,0
  4139.  
  4140. WLocate 2,04:Print "DECIMAL"
  4141. WLocate 2,18:Print " HEX$"
  4142. WLocate 2,32:Print "BINARY%"
  4143.  
  4144. DEFTYPE.I value
  4145.  
  4146. Repeat
  4147.     ev.l=WaitEvent
  4148.     If ev=$40         ;gadget up
  4149.         
  4150.         Select GadgetHit
  4151.             Case O
  4152.                 value=Val(StringText$(O,O))
  4153.             Case 1
  4154.  
  4155. Page 77
  4156.  
  4157.  
  4158.  
  4159.                 r$=UCase$(StringText$(0,1)) 
  4160.                 value=O:i=Len(r$):b=1 
  4161.                 While i>0 
  4162.                     a=Asc(Mid$(r$,i,1)) 
  4163.                     If a>65 Then a-55 Else a-48 
  4164.                     value+a*b 
  4165.                     i-1 :b*16 
  4166.                 Wend
  4167.             Case 2 
  4168.                 r$=StringText$(0,2) 
  4169.                 value=O:i=Len(r$) b=1 
  4170.                 While i>0 
  4171.                     a=Asc(Mid$(r$,i,1))-48 
  4172.                     value+a*b i-1 
  4173.                     :b*2 
  4174.                 Wend 
  4175.             End Select 
  4176.             ActivateString 0,GadgetHit 
  4177.             SetString O,O,Str$(value) 
  4178.             SetString 0,1,Right$(Hex$(value),4) 
  4179.             SetString 0,2,Right$(Bin$(value),16) 
  4180.             Redraw O.O:Redraw 0.1 Redraw 0 2
  4181.             Endif 
  4182. Until ev=$200 
  4183.  
  4184. Prop Gadgets 
  4185.  
  4186. The following program creates a simple RGB palette requester,  allowing  the
  4187. user to adjust the colors of the screen.  PropGadgets can be thought  of  as
  4188. sliders,  in this example we create three vertical PropGadgets to  represent
  4189. the Red, Green and Blue components of the current color register selected.
  4190.  
  4191. The  32  color registers are represented with 32 text gadgets.  The gadget's
  4192. colour  is  set  by changing GadgetPens before the gadget is  added  to  the
  4193. gadget  list.   Using GadgetJam I the two spaces are shown  as  a  block  of
  4194. colour.
  4195.  
  4196. ;
  4197. ; simple palette requester
  4198. ;
  4199.  
  4200. FindScreen O
  4201.  
  4202. For p=O To 2
  4203.     PropGadget 0,p*22+8,14,128,p,16,54
  4204. Next
  4205.  
  4206. For c=O To 31 GadgetJam 1 :GadgetPens O,c 
  4207.     x=c AND 7:y=lnt(c/8) 
  4208.     TextGadget 0,x*28+72,14+y*14,32,3+c," " ;<-2 spaces 
  4209. Next
  4210.  
  4211. Page 78
  4212.  
  4213. Window 0,100,50,300,72,$100A,"PALETTE REQUESTER",1,2,0
  4214.  
  4215. cc=0:Toggle 0,3+cc,0n:Redraw 0,3+cc
  4216.  
  4217. Repeat
  4218.     SetVProp 0,0,1-Red(cc)/15,1/16
  4219.     SetVProp 0,1,1 -Green(cc)/15,1/16
  4220.     SetVProp 0,2,1 -Blue(cc)/15,1/16
  4221.     Redraw 0,0:Redraw 0,1 :Redraw 0,2
  4222.     ev. l=WaitEvent
  4223.     If ev=$40 AND GadgetHit>2
  4224.         Toggle 0,3+cc,0n:Redraw 0,3+cc
  4225.         cc=GadgetHit-3
  4226.         Toggle 0,3+cc,0n:Redraw 0,3+cc
  4227.     Endif
  4228.     If (ev=$20 OR ev=$40) AND GadgetHit<3
  4229.         r.b=VPropPot(0,0)*16
  4230.         g.b=VPropPot(0,1)*16
  4231.         b.b=VPropPot(0,2)*16
  4232.         RGB cc,15-r,15-g,15-b
  4233.     Endif
  4234. Until ev=$200
  4235.  
  4236. Database Type Application
  4237.  
  4238. The  following  listing is a simple data base program  to  hold  a  list  of
  4239. names, phone numbers and addresses.
  4240.  
  4241. The  user  interface can either be typed in as listed or created  using  the
  4242. IntuiTools tutorial later in this manual.
  4243.  
  4244. If  a  text file exists called phonebook.data we read it into a list,   each
  4245. item of the list has been set up to hold 4 strings using the NewType person.
  4246. Using  a  list instead of a normal array means that we think of each  record
  4247. inside  the  list  as connected to the one before and the one  after  rather
  4248. than just being an individual item.  Blitz2 keeps an internal pointer to the
  4249. 'current'  item  and  the various list commands enable  us  to  change  that
  4250. internal pointer and operate on the item it points to.
  4251.  
  4252. Dhone book program
  4253.  
  4254. FindScreen 0
  4255.  
  4256. ;the following is from ram:t as created in the intuitools tutorial
  4257.  
  4258. Borders On:BorderPens 1,2:Borders 4,2
  4259. StringGadget 0,72,12,0,1,40,239
  4260.  
  4261. Page 79
  4262.  
  4263.  
  4264. StringGadget 0,72,27,0,2,40,239
  4265. StringGadget 0,72,43,0,3,40,239
  4266. StringGadget 0,72,59,0,4,40,239
  4267. GadgetJam 0:GadgetPens 1,0
  4268. TextGadget 0,8,75,0,10,"NEW ENTRY"
  4269. TextGadget 0,97,75,0,11,-I <"
  4270. TextGadget 0,129,75,0,12, "<<"
  4271. TextGadget 0,161,75,0,13, ">>"
  4272. TextGadget 0,193,75,0,14,">1 "
  4273. TextGadget 0,226,75,0,15,"DIAL"
  4274. TextGadget 0,270,75,0,16,"LABEL"
  4275.  
  4276. SizeLimits 32,32,-1,-1
  4277. Window 0,0,24,331,91,$100E,"MY PHONE BOOK",1,2,0
  4278. WLocate 2,19:WJam 0:WColour 1,0
  4279. Print "Address"
  4280. WLocate 19,50
  4281. Print "Phone"
  4282. WLocate 27,3
  4283. Print "Name"
  4284.  
  4285. ; and now we start typing...
  4286.  
  4287. #num=4 ;4 strings for each person
  4288.  
  4289. NEWTYPE .person
  4290. info$[#num]
  4291. End NEWTYPE
  4292.  
  4293. Dim List people.person(200)
  4294.  
  4295. USEPATH people()
  4296.  
  4297. ; read in names etc from sequential file
  4298.  
  4299. If ReadFile (0 , "phonebook. data")
  4300.     Filelnput 0
  4301.     While NOT Eof(0)
  4302.         If Additem(people())
  4303.             For i=0 To #num-1 :\info[i]=Edit$(128):Next
  4304.         Endif
  4305.     Wend
  4306. Endif
  4307.  
  4308. ResetList people()
  4309.  
  4310. ;if empty add blank record
  4311.  
  4312. If NOT Nextitem(people()) Then Additem people()
  4313.  
  4314. refresh:
  4315.  
  4316. Page 80
  4317.  
  4318.  
  4319. ref=0
  4320. For i=0 To #num-1
  4321.     SetString 0,i+1,\info[i]:Redraw 0,i+1
  4322. Next
  4323. ActivateString 0,1 :VWait 5
  4324. Repeat
  4325.     ev.l=WaitEvent
  4326.     ;
  4327.     if ev=$200            ;close window event
  4328.     Gosub update
  4329.     If WriteFile (0,"phonebook.data");save data to file
  4330.     FileOutput 0
  4331.     ResetList people()
  4332.     While Nextitem(people())
  4333.         For i=0 To #num-1 :NPrint \info[i]:Next    
  4334.     Wend    
  4335.     CloseFile 0
  4336. Endif
  4337. Endif
  4338.  
  4339. If ev=64
  4340. If GadgetHit=#num Then ActivateString 0,1
  4341. If GadgetHit<#num Then ActivateString 0,GadgetHit+1
  4342.     Select GadgetHit
  4343.         Case 1 0
  4344.             Gosub update:lf Additem(people()) Then ref=1
  4345.         Case 1 1
  4346.             Gosub update:lf Firstitem(people()) Then ref=1
  4347.         Case 1 2
  4348.             Gosub update:lf Previtem(people()) Then ref=1
  4349.         Case 1 3
  4350.             Gosub update:lf Nextitem(people()) Then ref=1
  4351.         Case 1 4
  4352.             Gosub update:lf Lastitem(people()) Then ref=1
  4353.         End Select
  4354. Endif
  4355. Until ref=1
  4356. Goto refresh
  4357.  
  4358. Update:
  4359. For i=0 To #num-1:\info[i]=StringText$(0,i+1) : Next: Return
  4360.  
  4361. Page 81
  4362.  
  4363.  
  4364. List Processor for Exec based Lists
  4365.  
  4366. The  Following  program  is  an   example   of  accessing  Operating  System
  4367. structures.   Before  entering  this  program  you  will  need  to  add  the
  4368. AmigaLibs.res file to the Blitz 2 environment.  To do this open the Compiler
  4369. Options  requester from the Compiler Menu.  Click in the Residents  box  and
  4370. type in AmigaLibs.Res.
  4371.  
  4372. You  may  need a pathname.  AmigaLibs is found in the Resident directory  of
  4373. the Blitz 2 program disk.
  4374.  
  4375. By  selecting  ViewTypes from the compiler menu the entire  set  of  structs
  4376. should be listed that are used by the Amiga's operating system.
  4377.  
  4378. The  first  line of our program defines the variable exec as  a  pointer  to
  4379. type  ExecBase.  As the Amiga keeps the location of this variable in  memory
  4380. location  4 we can use the Peek.l (long)  command to read the 4  byte  value
  4381. from memory into our pointer vanable.
  4382.  
  4383. Blitz  2  now knows that exec points to an execbase structure and using  the
  4384. backslash  character we can access any of the variables in this stucture  by
  4385. name.
  4386.  
  4387. If  you  select ViewTypes from the compiler menu and type in ExecBase  (case
  4388. sensitive) you can view all the variables in the execbase structure.
  4389.  
  4390. We  then  define another pointer type called *mylist.List.  We can then  use
  4391. this to point to any List found in execbase such as LibList or DeviceList.
  4392.  
  4393. An  exec list consists of a header node and a series of link nodes that hold
  4394. the list of devices or libraries or what have you.
  4395.  
  4396. We point mynode at the lists first link node in the third line of code.
  4397.  
  4398. The  next  line  loops  through the link nodes until the node's  successor=0
  4399. which means we have arrived back at the header node.
  4400.  
  4401. Peek$  reads  ascii data from memory until a zero is found,   this  is  very
  4402. useful  for  placing text pointed to by a C definition  such  as  *In_Name.b
  4403. into Blitz 2's string work area.
  4404.  
  4405. We then point mynode at the next node in the list.
  4406.  
  4407. Exec /ist processor
  4408.  
  4409. *exec.ExecBase=Peek.1(4)
  4410.  
  4411. *mylist.List=*exec\LibList
  4412.  
  4413. *mynode.Node=*mylist\lh_Head
  4414.  
  4415. While *mynode\ln_Succ
  4416.  
  4417.  
  4418. Page 82
  4419.  
  4420.  
  4421. a$=Peek$(*mynode\1n_Name)
  4422. NPrint a$
  4423. Amynode=*mynode\ln Succ
  4424. Wend
  4425.  
  4426. MouseWait
  4427.  
  4428. Prime Number Generator
  4429.  
  4430. The following program generates a list of prime numbers from 2 up to a limit
  4431. specified by the user.  A list of all the prime numbers found is kept  in  a
  4432. Blitz 2 List structure.
  4433.  
  4434. We  begin by inputting the upper limit from the user using the default input
  4435. output and the edit() command, the numeric form of the edit$() command.
  4436.  
  4437. The  While..Wend structure is used to loop through the main algorithm  until
  4438. the  upper  limit is reached.  The algorithm simply takes the next  integer,
  4439. loops  through the list of the prime numbers it has already generated  until
  4440. either  it finds a divisible number or it is too far through the  list  (the
  4441. item  in  the  list  is  greater than the square root of  the  number  being
  4442. checked).
  4443.  
  4444. If  the algorithm does not find a divisor in its search through the list  it
  4445. prints the new prime and adds it to the end of the list.
  4446.  
  4447. Print "Primes to what value "    ;find out limit to run program to
  4448. v=Edit(80)            ;input numeric
  4449. If v=0 Then End            ;if O then don't carry on
  4450. tab.w=0:tot.w=0            ; reset counters
  4451. Dim List primes(v)        ; dim a list to hold primes
  4452. p=2                ;add the number2 to ourlist
  4453. Additem primes()
  4454. primes()=p
  4455.  
  4456. While p<v        ;loop until limit reached
  4457. p+1            ;increment p
  4458. flag=1            ;set flag
  4459. d=0
  4460. q=Sqr(p)         ; set search limit
  4461. ResetList primes()    ;loop through list
  4462. While Nextitem(primes()) AND d<q AND flag
  4463. d=primes()
  4464. flag=p MOD d
  4465. Wend
  4466. If flag<>0             ;if found print and add it to list
  4467.     Print p,Chr$(9)     ;chr$(9) is a TAB character
  4468.     tab+1 :tot+1
  4469.     If tab=10 Then NPrint "":tab=0
  4470.     AddLast primes()
  4471.     primes()=p
  4472. Endif
  4473.  
  4474. Page 83
  4475.  
  4476.  
  4477. Wend
  4478.  
  4479. NPrint Chr$(10)+"Found ",tot," Primes between 2 & ",v
  4480. NPrint "Left Mouse Button to Exit"
  4481.  
  4482. MouseWait
  4483.  
  4484. Clipped Blits
  4485.  
  4486. The  following program illustrates a method to clip bliss.  When a shape  is
  4487. blitted outside the area of a bitmap an error occurs.  To have shapes appear
  4488. half  inside  a bitmap and half outside we use a larger bitmap and  position
  4489. the display inside.  The size of the outer frame is dependent on the size of
  4490. the shapes that will be drawn.
  4491.  
  4492. In  the  following example we are using 32x32 pixel shape  and  so  need  an
  4493. extra  32 pixels all round the bitmap.  The Show 0,32,32 centres the display
  4494. inside the larger bitmap.
  4495.  
  4496. We  also  have  to  use the extended form of the slice  command  as  we  are
  4497. displaying a bitmap wider than the display.
  4498.  
  4499. The  RectsHit(x,y,  I,  1,0,0,320+32,256+32)  function returns true  if  the
  4500. shape  is inside the larger bitmap and should be blitted.  If the shape  was
  4501. larger  or  it had a centred handle the parameters would need to be  changed
  4502. to accomadate these factors.
  4503.  
  4504. The.makeshape routine creates a temporary bitmap to draw a patern  and  then
  4505. transfer it to a shape object using the GetaShape command.
  4506.  
  4507. BLITZ
  4508.  
  4509. Gosub makeshape
  4510.  
  4511. BitMap 0,320+64,256+64,3
  4512. Slice 0,44,320,256,$fff8,3,8,8,320+64,320+64
  4513. Show 0,32,32
  4514.  
  4515. While Joyb(O)=0
  4516. x.w=Rnd(1024)-512
  4517. y.w=Rnd(1024)-512
  4518. If RectsHit(x,y,1,1,0,0,320+32,256+32)
  4519. Blit O,x,y
  4520. Endif
  4521. Wend
  4522.  
  4523. .makeshape:
  4524. BitMap 1,32,32,3
  4525. For i=1 To 15:Circle 16,16,i,i:Next
  4526. GetaShape 0,0,0,32,32
  4527. Free BitMap 1
  4528. Return
  4529.  
  4530. Page 84
  4531.  
  4532.  
  4533. Dual Playlield Slice
  4534.  
  4535. The  following program demonstrate the use of a dual playfield display.   As
  4536. described  in  the  previous  chapter dual playfield  lets  us  display  two
  4537. bitmaps simultaneously using the ShowF and ShowB commands.
  4538.  
  4539. The macro rndpt simply inserts the code Rnd((i40),Rnd(5 12)  into the source
  4540. each time it is called.  For instance Line !rndpt,!rndpt,Rnd(7)  is expanded
  4541. internally by the compiler to reud:
  4542.  
  4543. Line Rnd(640),Rnd(512),Rnd(640),Rnd(512),Rnd(7)
  4544.  
  4545. Once  again the extended from of the slice command has to be used with flags
  4546. set to $fffa giving us a lores dualplayfield scrollable display.
  4547.  
  4548. In  dualplayfield  we can think of having two displays,  the  ShowF  command
  4549. positions  the  front display inside BitMap 1,  the ShowB command  positions
  4550. the backdrop display inside BitMap 0.  Note that we must pass the x position
  4551. of  the  other  display  with ShowF and ShowB so that Blitz2  can  calculate
  4552. internal variables properly.
  4553.  
  4554. BLITZ
  4555.  
  4556. Macro rndpt Rnd(640),Rnd(512):End Macro
  4557.  
  4558. BitMap 0,640,512,3
  4559. For i=0 To 255
  4560.     Line !rndpt,!rndpt,Rnd(7)
  4561. Next
  4562.  
  4563. BitMap 1,640,512,3
  4564. For i=0 To 255
  4565.     Circlef!rndpt,Rnd(15),Rnd(7)
  4566. Next
  4567.  
  4568. Slice 0,44,320,256,$fffa,6,8,16,640,640
  4569.  
  4570. While Joyb(O)=0
  4571. VWait
  4572. x1 =160+Sin(r)* 160
  4573. y1 =128+Cos(r)*128
  4574. x2=160-Sin(r)*160
  4575. y2=128-Cos(r)4128
  4576. ShowF 1,x1,y1,x2
  4577. ShowB 0,x2,y2,x1
  4578. r+.O5
  4579. Wend
  4580.  
  4581. Page 85
  4582.  
  4583.  
  4584. Double Buffering
  4585.  
  4586. The  following  code  illustrates the use  of  a  double  buffered  display,
  4587. necessary  to  acheive  smooth  moving  graphics.   The  trick  with  double
  4588. buffering  is  that while one bitmap is displayed we can  change  the  other
  4589. without any glitches happening on the display.
  4590.  
  4591. The  VWait  command waits for the vertical beam to be  at  the  top  of  the
  4592. display,   which is when we are allowed to swap the bitmaps being  displayed
  4593. without getting any glitches.
  4594.  
  4595. The  db=l-db equation will mean that db alternates between O & 1 each frame.
  4596. We  Show  db,  toggle it (db=l-db)  and then Use Bitmap db,  to acheive  the
  4597. "draw  to  one bitmap while displaying the other" technique known as  double
  4598. buffering.
  4599.  
  4600. Because  we  have  two bitmaps,  we need two queues to use  QBlit  properly.
  4601. QBlits work by doing a normal Blit and storing the position of the  Blit  in
  4602. a  queue.  The UnQueue command will erase all parts of the screen listed  in
  4603. the  queue  so  we can draw the balls in their new positions with  out  them
  4604. leaving "trails" behind them from their old position.
  4605.  
  4606. The move #-1,$dffl80 pokes the background color to white,  this allows us to
  4607. see  how  much  of the frame has been taken since the VWait to  execute  the
  4608. code.  If we increase the number of balls,  the moving and drawing loop will
  4609. take  longer  than  a  frame (50th of a second)  and the  white  will  start
  4610. flashing as the poke will only be happening every second frame.  See chapter
  4611. 10 for a more thorough discussion of frame rates etc.
  4612.  
  4613. Hmm,   the only other thing I'll mention is the bounce logic used  when  the
  4614. ball  moves outside the bitmap.  We reverse the direction but also  add  the
  4615. new  direction  to the position so the program never attempts  to  Blit  the
  4616. shape outside of the bitmap.
  4617.  
  4618. BLITZ
  4619.  
  4620. n=25
  4621.  
  4622. NEWTYPE .ball
  4623.     x.w:y:xa:ya
  4624. End NEWTYPE
  4625.  
  4626. Dim List b.ball(n-1)
  4627. While Additem(b())
  4628.     b()\x=Rnd(320-32), Rnd (256-32), Rnd (4)-2, Rnd(4)-2
  4629. Wend
  4630.  
  4631. Gosub getshape
  4632.  
  4633. BitMap 0,320,256,3
  4634. BitMap 1,320,256,3
  4635. Queue O,n
  4636. Queue 1,n
  4637. Slice 0,44,3
  4638.  
  4639. Page 86
  4640.  
  4641.  
  4642. While Joyb(0)=0
  4643. VWait
  4644. Show db
  4645. db=1-db
  4646. Use BitMap db
  4647. UnQueue db
  4648. ResetList b()
  4649. USEPATH b()
  4650. While Nextitem(b())
  4651.     \x+\xa:\y+\ya
  4652.     If NOT RectsHit(\x,\y,1,1,0,0,320-32,256-32)
  4653.     \xa=-\xa:\ya=-\ya
  4654.     \x+\xa:\y+\ya
  4655. Endif
  4656. QBlit db,0,\x,\y
  4657.  
  4658. Wend
  4659. MOVE #-1,$dff180
  4660. Wend
  4661.  
  4662. End
  4663.  
  4664. .getshape:
  4665. BitMap 1,32,32,3
  4666. For i=1 To 15:Circle 16,16,i,i:Next
  4667. GetaShape 0,0,0,32,32
  4668. Free BitMap 1
  4669. Return
  4670.  
  4671. Smooth Scrolling
  4672.  
  4673. This  final  example  demonstrates smooth  scrolling  as  discussed  in  the
  4674. previous chapter.
  4675.  
  4676. The  Scroll  commands are used to copy the left side of the  bitmap  to  the
  4677. right  and  the top half of the bitmap to the bottom.  This in effect  means
  4678. the large bitmap is the same in each quarter.
  4679.  
  4680. Because  of this we can scroll the display across the bitmap,  and  when  we
  4681. hit  the right edge reset the display back to the left edge without any jump
  4682. in  the  display as both left and right sides of the bitmap  are  the  same.
  4683. This is the same for scrolling the display down the bitmap.
  4684.  
  4685. Note how to be able to access mouse moves we need the Mouse On command.   We
  4686. can then take the amount the mouse has been moved by the user and add it  to
  4687. the speed in which we are moving the display around the bitmap.
  4688.  
  4689. The  QLimit(xa+MouseXSpeed,-2O,20)  command makes sure that the  xa  (x_add)
  4690. variable always stays inside the limits -20..20.
  4691.  
  4692. The x=QWrap(x+xa,O,320) command means that when the displays position inside
  4693.  
  4694. Page 87
  4695.  
  4696.  
  4697. the bitmap reached the right edge of the bitmap it wraps around to the left.
  4698.  
  4699. BLITZ
  4700. Mouse On
  4701. n=25
  4702. BitMap 0,640,512,3
  4703.  
  4704. For i=0 To 150
  4705.     Circlef Rnd(320-32)+16,Rnd(256-32)+16,Rnd(16),Rnd(8)
  4706. Next
  4707.  
  4708. Scroll 0,0,320,256,320,0
  4709. Scroll 0,0,640,256,0,256
  4710.  
  4711. Slice 0,44,320,256,$fff8,3,8,8,640,640
  4712.  
  4713. While Joyb(0)=0
  4714. VWait
  4715. Show db,x,y
  4716. xa=QLimit(xa+MouseXSpeed,-20,20)
  4717. ya=QLimit(ya+MouseYSpeed, -20,20)
  4718. x=QWrap(x+xa,0,320)
  4719. y=QWrap(y+ya,0,256)
  4720. Wend
  4721.  
  4722. Page 88
  4723.  
  4724.  
  4725.  
  4726. 11. DISPLAY LIBRARY & AGA PROGRAMMING
  4727.  
  4728. Introduction
  4729. The  Display  Library  is  a  recent addition  to  Blitz.   Developed  as  a
  4730. replacement to Slices it not only offers games programmers access to all  of
  4731. the  new  AGA  features  but  offers a slightly  more  modular  approach  to
  4732. controlling the Amiga's graphics hardware.
  4733.  
  4734. The  Amiga's display is controlled by the copper.  The copper is a secondary
  4735. processor that executes a list of instructions every frame.  For  those  new
  4736. to  such  concepts,  the Amiga redraws the screen 50 times a  second,   each
  4737. redraw  is known as a frame.  The video beam which sweeps across the  screen
  4738. drawing  each  pixel  is  controlled by certain hardware  registers,   these
  4739. registers are poked by the copper whose job it is to keep everything m sync.
  4740. A  coplist  contains  information about the colours,   bitplanes,   sprites,
  4741. resolution  and  more  that  the video beam requires  to  render  a  typical
  4742. display.
  4743.  
  4744. Initialising
  4745.  
  4746. Unlike  Slices  which  appear as soon as they are  initialised  the  display
  4747. library requires coplists to be initialised (using InitCopList)  prior to  a
  4748. display being created (using CreateDisplay).  The important difference  here
  4749. is  that  Slices require memory to be allocated each time a  change  to  the
  4750. video  display  is  required  while  the  Display  library  allows  multiple
  4751. CopLists to be initialised before any displays are created.
  4752.  
  4753. There  are  two forms of the InitCopList command.  The short version  simply
  4754. requires the CopList# which is to be initialised and the flags.  The  height
  4755. of the display will default to 256 pixels high.  A width of 320, 640 or 1280
  4756. will  be  used  depending on the resolution set in the  flags  as  will  the
  4757. number of colors.
  4758.  
  4759. The longer version has the following format:
  4760.  
  4761. InitCopList CopList#,ypos,height, type,sprites,colors,customs
  4762.  
  4763. The  ypos  is usually set to 44 the standard top of frame for a PAL display.
  4764. If  the CopLIst is to be used below another coplist on the same display ypos
  4765. should be set to 2 scan lines below the last CopLists bottom line.
  4766.  
  4767. Sprites  should always be set to eight,  even if they are not all available,
  4768. colors  should  be  set to the number required.  When  using  more  than  32
  4769. colours ensure that the #agacolors flag MUST be set.
  4770.  
  4771. Customs  allocate  enough  room  for advanced  custom  copper  lists  to  be
  4772. attached to each display.  See later on in this chapter for a discussion  on
  4773. using customcops.
  4774.  
  4775. Page 89
  4776.  
  4777. Flags used with InitCopList
  4778.  
  4779. The flags value is calculated by adding the following values together.
  4780.  
  4781. Note:  variables must be long (32 bits) when used as the flags parameter for
  4782. the InitCoplist command.
  4783.  
  4784. #onebitplane=                $01
  4785. #twobitplanes=                $02
  4786. #threebitDlanes=            $03
  4787. #fourbitplanes=                $04
  4788. #fivebitplanes=                $05
  4789. #sixbitplanes=                $06
  4790. #sevenbitplanes=            $07*
  4791. #eightbitplanes=            $08*
  4792.  
  4793. #smoothscrolling=    $10    ;set if you will be scrolling the bitmap
  4794. #dualplavfield=        $20    ;enable dual playfield mode
  4795. #extrahalfbrite=    $40    ;forces 6 bitplane display into ehb mode
  4796. #ham=            $80    ;display in ham
  4797.  
  4798. #lores=                    $000
  4799. #hires=                    $100
  4800. #superhires=                $200
  4801.  
  4802. #loressprites=                $400
  4803. #hiressprites=                $800*
  4804. #superhiressprites=            $c00
  4805.  
  4806. #fetchmodeO=                $0000
  4807. #fetchmode1 =                $1000*
  4808. #fetchmode2=                $2000*
  4809. #fetchmode3=                $3000*
  4810.  
  4811. #agacolors=                    $10000*
  4812.  
  4813. * These flags should only be used with AGA Amigas.
  4814.  
  4815. Colors
  4816.  
  4817. The #agacolors flag must ALWAYS be set when more than 32 colours are in  use
  4818. or when 24 bit color definition is required.
  4819.  
  4820. SmoothScrolling
  4821.  
  4822. By  setting the smooth scrolling flag the extended form of DisplayBitmap may
  4823. be used which allows the bitmap to be displayed at any offset.  This enables
  4824. the  programmer  to scroll the portion of the bitmap being  displayed.   See
  4825. BlitzMode programming chapter for an explanation of hardware scrolling.
  4826.  
  4827. Notes:
  4828.  
  4829. *  Always  use the extended form of DisplayBitmap with smoothscrolling  set,
  4830. even when offset is 0,0.
  4831.  
  4832. Page 90
  4833.  
  4834.  
  4835. *  DisplayBitmap accepts quick types for the x offset and will position  the
  4836. bitmap in fractions of pixels on AGA machines.
  4837.  
  4838. *  The width of the display will be less than the default 32()/640/1280 when
  4839. smooth scrolling is enabled.
  4840.  
  4841. DualPlayfield
  4842.  
  4843. By  setting the DualPlayfield flag two bitmaps may be displayed  on  top  of
  4844. each  other  in  one   display.    A   combination   of   DualPlayfield  and
  4845. SmoothScrolling is allowed for parallax type effects.  Note  that  with  AGA
  4846. machines,   it  is  possible to display two 16 colour  bitmaps  by  enabling
  4847. DualPlayfield and setting number of bitmaps to 8.
  4848.  
  4849. Sprites
  4850.  
  4851. The  number of sprites available will depend on the type of display and  the
  4852. fetchmode  settings Most AGA modes will require the  display  to  be  shrunk
  4853. horizontally  for 8 sprites to be displayed.  Currently  this  can  only  be
  4854. acheived using the DisplayAdjust command,  certain examples of this  can  be
  4855. found on the Blitz examples disk.
  4856.  
  4857. AGA  hardware allows the programmer to display sprites in lores,   hires  or
  4858. superhires.  The higher resolutions allow graphics dithering by the  artist,
  4859. essential  if  3  coloured  sprites are in use.   Larger  sprites  are  also
  4860. available  using  the  SpriteMode command.  Dithered  large,   super  hi-res
  4861. sprites  can  be  created  to  look better than lower  resolution  16  color
  4862. sprites using such tools as ADPro.
  4863.  
  4864. Note  that it is unrealistic to display more than 4 bitplanes and have  more
  4865. than  3  sprite channels available,  the adjust required results in  a  very
  4866. narrow display indeed.
  4867.  
  4868. FetchMode
  4869.  
  4870. AGA  hardware allows bitplane data to be fetched by the DMA in 16,32  or  64
  4871. pixel groups.  The larger fetches give the processor more bandwidth, this is
  4872. especially noticeable with AGA Amiga's running without additional fastmem.
  4873.  
  4874. When  using increased fetchmodes bitplanes must always be a multiple  of  64
  4875. pixels wide.
  4876.  
  4877. Those  wanting to attempt DisplayAdjusts on displays with larger  fetchmodes
  4878. will  encounter severe difficulties in creating a proper display.  We  think
  4879. it  is actually impossible for displays to run at fetchmode 3 with more than
  4880. I sprite without having to adjust the display to around 256 pixels across.
  4881.  
  4882. Multiple Displays
  4883.  
  4884. When  more than one CopList is to be displayed care must be taken that there
  4885. is  a  gap of at least 3 lines between each.  This means the ypos of a lower
  4886. coplist must be equal or greater than the above's ypos+height+3.
  4887.  
  4888. Page 91
  4889.  
  4890. Advanced Copper Control
  4891.  
  4892. The  long  format  of the InitCopList command allows allocation  for  custom
  4893. copper  commands.  Certain commands have been added to the  Display  Library
  4894. which will require this parameter to be set.
  4895.  
  4896. There  are  two forms of custom copper commands,  the first will  allow  the
  4897. copper  to  affect  the display every scanline while the  second  defines  a
  4898. certain line for the copper to do it's thing. These new commands include:
  4899.  
  4900. The  following  require  a  negative   size,   this  denotes  that  so  many
  4901. instructions must be allocated for every scanline of the display.
  4902.  
  4903. DisplayDblScan      CopList#,Mode[,copoffset];(size=-2)       DisplayRainbow
  4904. CopList#,Register,Palette[,copoffset]   ,(ecs=-   I   aga=-4)     DisplayRGB
  4905. CopList#,Register,line,r,g,b[,copoffset]   ;(ecs=-1   aga=-4)    DisplayUser
  4906. CopList#,Line,String[,CopOffset];(size=-len/4)                 DisplayScroll
  4907. CopList#,&xpos.q(n),&xpos.q(n)[,CopOffset];(size=-3)
  4908.  
  4909. The  following  require  the  size  be specified  as  a  positive  parameter
  4910. denoting  that so many instructions be allocated for each instance  of  each
  4911. command.   Note that these two commands may NOT be mixed with  the  commands
  4912. above.
  4913.  
  4914. CustomColors   CopList#,CCOffset,YPos,Palette,startcol,numcols  CustomString
  4915. CopList#,CCOffset, YPos,Copper$
  4916.  
  4917. The  use  of  these commands is illustrated by code included  in  the  Blitz
  4918. examples drawer.
  4919.  
  4920. Page 92
  4921.  
  4922. Display Example 1
  4923.  
  4924. This  first example creates two large bitmaps.  It renders lines to one  and
  4925. boxes  on the other.  A 32 color palette is created the first 16 colors  are
  4926. used by the back playfield and second 16 by thr front piayfield.
  4927.  
  4928. The flags in the InitCopList command are the sum of the following:
  4929.  
  4930.     #eightbitplanes=    $08
  4931.     #smoothscrolling=    $10
  4932.     #dualplayfield=        $20
  4933.     #lores=            $000
  4934.     #fetchmode3=        $3000*
  4935.     #agacolors=        $10000*
  4936.  
  4937. Note  how  the InitCopList command can be executed before going  into  Blitz
  4938. mode.   All  the  display   commands   are   mode   independent  except  for
  4939. CreateDisplay which can only be executed in Blitz mode.
  4940.  
  4941. Finally  note the extended form of the DispiayBitmaD command.   This  allows
  4942. the offset position of both bitmaps to be assigned with the one command.
  4943.  
  4944. ;
  4945. ; two 16 color playfield in dualplayfield mode
  4946. ;
  4947. BitMap 0,640,512,4
  4948. BitMap 1,640,512,4
  4949.  
  4950. For i=0 To 100
  4951.     Use BitMap O:Box Rnd(640) Rnd(512) Rnd(640) Rnd(512) Rnd(16)
  4952.     Use BitMap 1:Line Rnd(640j,Rnd(512j,Rnd(640j,Rnd(512j,Rnd(16)
  4953. Next
  4954.  
  4955. InitPalette 0 32
  4956. For i=1 To Si :AGAPalRGB 0,i,Rnd(256),Rnd(256),Rnd(256):Next
  4957.  
  4958. InitCopList 0,$13038
  4959.  
  4960. BLITZ
  4961.  
  4962. CreateDisplay O
  4963. DisplayPalette 0,0
  4964.  
  4965. While Joyb(O)=0
  4966.     VWait
  4967.     x=160+Sin(r)*160:y=128+Cos(r)*128
  4968.     DisplayBitMap 0,O,x,y,1,320-x,256-y
  4969.     r+.O5
  4970. Wend
  4971.  
  4972. End
  4973.  
  4974. Page 93
  4975.  
  4976.  
  4977. Display Example 2
  4978.  
  4979. This  second  example demonstrates the use of sprites  on  a  Display.   The
  4980. DisplayAdjust  is  required  so as to  allow  us  access  to  all  8  sprite
  4981. channels.   Unfortunately it is difficult to  up  the  fetch  mode  in  this
  4982. example without resorting to a very thin display.
  4983.  
  4984. The  SpriteMode2  tells  Blitz to create 64  pixel  wide  sprites  for  each
  4985. channel.   With  out  the SpriteMode each sprite would require  4  channels,
  4986. again this is one of the better new features of AGA.
  4987.  
  4988. It  should  be  noted  also  that  the DisplaySprite  command  also  accepts
  4989. fractional  x  parameters and will position the sprite at  fractional  pixel
  4990. positions if possible.
  4991.  
  4992. ;
  4993. ; smoothscrolling 16 color screen with 8 64 wide sprites
  4994. ;
  4995. SpriteMode 2
  4996. InitShape 0,64,64,2:ShapesBitMap O,O
  4997. Circlef 32,32,32,1 :Circle7 16,8,6,2:Circlef 48,8,6,3:Circlef 32,32,8,0
  4998. GetaSprite 0,0
  4999.  
  5000. BitMap 0,640,512,4
  5001.  
  5002. For i=0 To 100
  5003.     Use BitMap O:Box Rnd(640),Rnd(512),Rnd(640),Rnd(512),Rnd(16)
  5004. Next
  5005.  
  5006. InitPalette 0,48
  5007.  
  5008. For i=1 To 31 :AGAPalRGB 0,i,Rnd(256),Rnd(256),Rnd(256):Next
  5009.  
  5010. InitCopList 0,$10014
  5011.  
  5012. DisplayAdjust 0, -2,8,0,16,0; under scan!
  5013.  
  5014. BLITZ
  5015.  
  5016. CreateDisplay O
  5017. DisplayPalette 0,0
  5018.  
  5019. For i=0 To 7
  5020.     DisplaySprite 0,0,20+i*30,(20+i*50)&127,i
  5021. Next
  5022.  
  5023. While Joyb(O)=0
  5024.     VWait
  5025.     x=160+Sin(r)*160:y=128+Cos(r)*128
  5026.     DisplayBitMap O,O,x,y
  5027.     r+.O5
  5028. Wend
  5029.  
  5030. End
  5031.  
  5032. Page 94
  5033.  
  5034.  
  5035. R-1: PROGRAM FLOW COMMANDS
  5036.  
  5037. A  computer  program is made up of a sequence of commands that are  executed
  5038. sequentially (one after the other).  Certain commands are used to  interrupt
  5039. this process and cause program execution to jump to a different location  in
  5040. the  program.  There are several different ways of controlling this  program
  5041. flow in Blitz.
  5042.  
  5043. Standard  BASIC  commands to change program flow such as  Goto,   Gosub  are
  5044. standard in Blitz,  unlike older BASIC's, locations are specified as program
  5045. labels and not line numbers.  More modern structured BASIC features such  as
  5046. Procedures (known as Statements and Functions),  While..Wend, Repeat..Until,
  5047. Select..Case and more allow a more structured approach to programming.
  5048.  
  5049. Finally  Blitz allows control over Interrupts,  this allows external  events
  5050. to  override  normal program flow and jump (temporarily)   to  a  predefined
  5051. location in the program.
  5052.  
  5053. Goto Program Label
  5054.  
  5055. Goto  causes program flow to be transferred to the specified program  label.
  5056. This allows sections of a program to be 'skipped' or 'repeated'.
  5057.  
  5058. Gosub Program Label
  5059.  
  5060. Gosub  operates  in  two  steps.  First,  the location  of  the  instruction
  5061. following  the Gosub is remembered in a special storage area (known  as  the
  5062. 'stack').   Secondly,  program flow is transferred to the specified  Program
  5063. Label.
  5064.  
  5065. The  section of program that program flow is transferred to is  known  as  a
  5066. 'subroutine' and should be terminated by a Return command.
  5067.  
  5068. Return
  5069.  
  5070. Return  is  used  to  return program flow to the instruction  following  the
  5071. previously  executed   Gosub   command.    This   allows   the  creation  of
  5072. 'subroutines' which may be called from various points in a program.
  5073.  
  5074. On Expression Goto| Gosub Program LabelLProgram Label...]
  5075.  
  5076. On  allows a program to branch,  via either a Goto or a Gosub,  to one of  a
  5077. number  of  Program  Labels  depending upon  the  result  of  the  specified
  5078. Expression.
  5079.  
  5080. If  the  specified Expression results in a 1,  then the first Program  Label
  5081. will  be branched to.  A result of 2 will cause the second Program Label  to
  5082. be branched to and so on.  If the result of Expression is less than one,  or
  5083. not enough
  5084.  
  5085. Program Labels are supplied, program flow will continue without a branch.
  5086.  
  5087. End
  5088.  
  5089. End will halt program flow completely.  In the case of programs run from the
  5090. Blitz editor,  you will be returned to the editor. In the case of executable
  5091. files, you will be returned to the Workbench or CLI.
  5092.  
  5093. PAge 95
  5094.  
  5095. Stop
  5096.  
  5097. The Stop command causes the Blitz Debugger to interrupt program flow.  Place
  5098. Stop  commands  in your code as breakpoints when debugging,  ensure  runtime
  5099. errors are enabled.  Click on Run from the debugger to continue program flow
  5100. after a Stop.
  5101.  
  5102. If Expression [Then...]
  5103.  
  5104. If  allows execution of a section of program depending on the result  of  an
  5105. expression.  The Then command indicates only the rest of the  line  will  be
  5106. defined as the section of code to either execute or not.  Without a Then the
  5107. section of code will be defined as that up to the EndIf command.
  5108.  
  5109. Endif
  5110.  
  5111. EndIf  is used to terminate an 'If block'.  An If block is begun by  use  of
  5112. the  If  statement without the Then present.  Please refer to  If  for  more
  5113. information on If blocks.
  5114.  
  5115. Else [Statement..]
  5116.  
  5117. Else  may  be used after an If to cause program instructions to be  executed
  5118. if the expression specified in the If proved to be false.
  5119.  
  5120. While Expression
  5121.  
  5122. The  While command is used to execute a series of commands repeatedly  while
  5123. the  specified Expression proves to be true.  The cAmmands  to  be  executed
  5124. include all the commands following the While until the next matching Wend.
  5125.  
  5126. Wend
  5127.  
  5128. Wend is used in conjunction with While to determine a section of program  to
  5129. be executed repeatedly based upon the truth of an expression.
  5130.  
  5131. Select Expression
  5132.  
  5133. Select examines and 'remembers' the result of the specified Expression.  The
  5134. Case  commands  may  then be used to execute different sections  of  program
  5135. code depending on the result of the expression in the Select line.
  5136.  
  5137. Case Expression
  5138.  
  5139. A Case is used following a Select to execute a section of program code when,
  5140. and only when,  the Expression specified in the Case statement is equivalent
  5141. to the Expression evaluated in the Select statement.
  5142.  
  5143. If a Case statement is satisfied,  program flow will continue until the next
  5144. Case Default or End Select statement is encountered,  at which point program
  5145. flow will branch to the next matching End Select.
  5146.  
  5147. Page 96
  5148.  
  5149. Default
  5150.  
  5151. A  Default  statement may appear following a series of  Case  statements  to
  5152. cause  a  section  of  program  code to be executed  if  NONE  of  the  Case
  5153. statements were satisfied.
  5154.  
  5155. End Select
  5156.  
  5157. End  Select  terminates a Select...Case...Case...Case sequence.  If  program
  5158. flow  had been diverted through the use of a Case or Default statement,   it
  5159. will continue from the terminating End Select.
  5160.  
  5161. For Var=Expression 1 To Expression2 [Step Expression3]
  5162.  
  5163. The  For  statement initializes a For...Next loop.  All For/Next loops  must
  5164. begin  with  a  For statement,  and must have a terminating  Next  statement
  5165. further  down  the program.  For..Next loops cause a particular  section  of
  5166. code to be repeated a certain number of times.  The For statement does  most
  5167. of  the  work  in  a  For/Next  loop.  When For is executed,   the  variable
  5168. specified  by Var (known as the index variable)  will be set  to  the  value
  5169. Expressionl. After this, the actual loop commences.
  5170.  
  5171. At the beginning of the loop, a check is made to see if the value of Var has
  5172. exceeded  Expression2.   If so,  program flow will  branch  to  the  command
  5173. following the For/Next loop's Next,  ending the loop.  If not,  program flow
  5174. continues  on until the loop's Next is reached.  At this point,   the  value
  5175. specified  in Expression3 (the 'step' value)  is added to Var,  and  program
  5176. flow  is  sent  back  to the top of the loop,  where Var  is  again  checked
  5177. against Expression2.  If Expression3 is omitted,  a default step value of  I
  5178. will be used.
  5179.  
  5180. In  order  for  a For/Next loop to count 'down' from one value  to  a  lower
  5181. value, a negative step number must be supplied.
  5182.  
  5183. Next [var[,Var..]]
  5184.  
  5185. Next terminates a For..Next loop.  Please refer to the For command for  more
  5186. information on For..Next loops.
  5187.  
  5188. Repeat
  5189.  
  5190. Repeat is used to begin a Repeat...Until loop.  Each Repeat statement  in  a
  5191. program must have a corresponding Until further down the program.
  5192.  
  5193. The  purpose  of  Repeat/Until loops is to cause a section  of  code  to  be
  5194. executed  AT LEAST ONCE before a test is made to see if the code  should  be
  5195. executed again.
  5196.  
  5197. Until Expression
  5198.  
  5199. Until is used to terminate a Repeat/Until loop.  If Expression proves to  be
  5200. true  (non  0),  then program flow will continue from the command  following
  5201. Until.  If Expression proves to be false (0), then program flow will go back
  5202. to the corresponding Repeat, found further up the program.
  5203.  
  5204. Page 97
  5205.  
  5206. Forever
  5207.  
  5208. Forever may be used instead of Until to cause a Repeat/Until loop  to  NEVER
  5209. exit. Executing Forever is identical to executing 'Until 0'.
  5210.  
  5211. Pop Gosub| For| Select| If| While| Repeat
  5212.  
  5213. Sometimes,   it may be necessary to exit from a particular type  of  program
  5214. loop  in  order to transfer program flow to a different part of the program.
  5215. Pop  must be included before the Goto which transfers program flow out  from
  5216. the inside of the loop.
  5217.  
  5218. Actually,  Pop is only necessary to prematurely terminate Gosubs,  Fors  and
  5219. Selects.  If,  While and Repeat have been included for completeness but  are
  5220. not necessary.
  5221.  
  5222. MouseWait
  5223.  
  5224. MouseWait simply halts program flow until the left mouse button  is  pushed.
  5225. If  the left mouse button is already held down when a MouseWait is executed,
  5226. program flow will simply continue through.
  5227.  
  5228. MouseWait  should  normally be used only for program testing  purposes,   as
  5229. MouseWait severely slows down multi-tasking.
  5230.  
  5231. VWait [Frames]
  5232.  
  5233. VWait  will cause program flow to halt until the next vertical blank occurs.
  5234. The optional Frames parameter may be used to wait for a particular number of
  5235. vertical blanks.
  5236.  
  5237. VWait  is  especially useful in animation for synchrodizing display  changes
  5238. with the rate at which the display is physically redrawn by the monitor.
  5239.  
  5240. Statement Procedurename{[ParameterltParamater2...]]}
  5241.  
  5242. Statement declares all following code up to the next End Statement as  being
  5243. a 'statement type' procedure.
  5244.  
  5245. Up  to  6  Parameters  may be passed to a statement in  the  form  of  local
  5246. variables through which calling parameters are passed.
  5247.  
  5248. In  Blitz,   all statements and functions must be declared before  they  are
  5249. called.
  5250.  
  5251. End Statement
  5252.  
  5253. End  Statement declares the end of a 'statement type' procedure  definition.
  5254. All statement type procedures must be terminated with an End Statement.
  5255.  
  5256. Statement Return
  5257.  
  5258. Statement  Return  may be used to prematurely exit from a  'statement  type'
  5259. procedure.  Program flow will return to the command following the  procedure
  5260. call.
  5261.  
  5262. Page 98
  5263.  
  5264. Function [. Type] Procedurename{[Parameterl[,Parameter2...]]}
  5265.  
  5266. Function declares all following code up to the next End Function as being  a
  5267. function  type  procedure.   The optional Type  parameter  may  be  used  to
  5268. determine  what  type  of  result is returned by the  function.   Type.   if
  5269. specified,  must be one Blitz's 6 primitive variable types.  If no  Type  is
  5270. given, the current default type is used.
  5271.  
  5272. Up  to  6  Parameters  may be passed to a function  in  the  form  of  local
  5273. variables through which calling parameters are passed.  Functions may return
  5274. values through the Function Return command.
  5275.  
  5276. In  Blitz,   all statements and functions must be declared before  they  are
  5277. called.
  5278.  
  5279. End Function
  5280.  
  5281. End Function declares the end of a 'function type' procedure definition. All
  5282. function type procedures must be terminated with an End Function.
  5283.  
  5284. Function Return Expression
  5285.  
  5286. Function Return allows 'function type' procedures to return values to  their
  5287. calling expressions.  Function type procedures are always called from within
  5288. Blitz expressions.
  5289.  
  5290. Shared Var[,Var...]
  5291.  
  5292. Shared is used to declare certain variables within a procedure definition as
  5293. being  global  variables.   Any   variables  appearing  within  a  procedure
  5294. definition that do n<>t appear in a Shared statement are,  by default, local
  5295. variables.
  5296.  
  5297. Setint Type
  5298.  
  5299. Setint  is  used  to declare a section of program code as 'interrupt'  code.
  5300. Often,   when  a  computer program is running,  an event of some  importance
  5301. takes  place  which must be processed immediately.  The different  types  of
  5302. interrupt on the Amiga are as follows:
  5303.  
  5304. Type        Cause of Interupt
  5305.  
  5306. ()        Serial transmit buffer empty
  5307. 1        Disk Block read/written
  5308. 2        Sottware interupt
  5309. 3        Cia ports interupt
  5310. 4        Co-processor ('copper') interupt
  5311. 5        Vetical Blank
  5312. 6        glitter finished
  5313. 7        Audio channel 0 pointer/length fetched
  5314. 8        Audio channel I pointer/length fetched
  5315. 9        Audio channel 2 pointer/length fetched
  5316. 10        Audio channel 3 pointer/length fetched
  5317. 11        Serial receive butffer full
  5318. 12        Floppy disk sync
  5319. 13        External interupt
  5320.  
  5321. Page 99
  5322.  
  5323.  
  5324.  
  5325. The  most useful of these interrupts is the vertical blank interrupt.   This
  5326. interrupt  occurs every time an entire video frame has been fully  displayed
  5327. (about  every  sixtieth  of  a second),  and is very  useful  for  animation
  5328. purposes.   If a section of program code has been designated as  a  vertical
  5329. blank  interrupt handler,  then that section of code will be executed  every
  5330. sixtieth of a second.
  5331.  
  5332. Interrupt  handlers  must  perform   their  task  as  quickly  as  possible,
  5333. especially  in  the case of vertical blank handlers which  must  NEVER  take
  5334. longer than one sixtieth of a second to execute.
  5335.  
  5336. Interupt  handlers  in Blitz must NEVER access string variables  or  literal
  5337. strings.  In Blitz mode, this is the only restriction on interrupt handlers.
  5338. In Amiga mode, no blister, Intuition or file i/o commands may be executed by
  5339. interrupt handlers.
  5340.  
  5341. To set up a section of code to be used as an interrupt handler,  you use the
  5342. SetInt command followed by the actual interrupt handler code.  An End SetInt
  5343. should follow the interrupt code.  The Type parameter specifies the type  of
  5344. interrupt,  from the above table,  the interrupt handler should be  attached
  5345. to. For example, SetInt 5 should be used for vertical blank interrupt code.
  5346.  
  5347. More  than  one  interrupt handler may be attached to a particular  type  of
  5348. erupt.
  5349.  
  5350. End Setint
  5351.  
  5352. End  SetInt  must appear after a SetInt to signify the end of a  section  of
  5353. interrupt  handler  code.  Please refer to SetInt for  more  information  of
  5354. interrupt handlers.
  5355.  
  5356. Clrlnt Type
  5357.  
  5358. ClrInt  may  be used to remove any interrupt handlers currently attached  to
  5359. the specified interrupt Type.  The SetInt command is used to attach interupt
  5360. handlers to particular interupts.
  5361.  
  5362. SetErr
  5363.  
  5364. The SetErr command allows you to set up custom error handlers.  Program code
  5365. which  appears  after  the SetErr command will be executed  when  any  Blitz
  5366. runtime  errors are caused.  Custom error code should be  ended  by  an  End
  5367. SetErr.
  5368.  
  5369. End SetErr
  5370.  
  5371. End  SetErr  must  appear  following custom error handlers  installed  using
  5372. SetErr.   Please  refer  to  SetErr tor more  information  on  custom  error
  5373. handlers.
  5374.  
  5375. ClrErr
  5376.  
  5377. ClrErr may be used to remove a custom error handler set up using SetErr.
  5378.  
  5379. ErrFail
  5380.  
  5381. ErrFail may be used within custom error handlers to cause a 'normal'  error.
  5382. The  error  which  caused the custom error handler to be  executed  will  be
  5383. reported and transfer will be passed to direct mode.
  5384.  
  5385. Page 100
  5386.  
  5387. R-2: VARIABLE HANDLING COMMANDS
  5388.  
  5389. To  keep  track  of numbers and text program variables are required.   These
  5390. variables are assigned a name and given a type which dictates  the  sort  of
  5391. information  they  are able to contain.  Blitz supports 5  standard  numeric
  5392. types and the string type which is used to store text type information.
  5393.  
  5394. Variable "arrays" are used to store a large collection of values all of  one
  5395. type,   these  arrays are similar to normal variables except  they  must  be
  5396. dimensioned (the number of elements defined) before they are used.
  5397.  
  5398. Blitz  offers  many  extensions to these BASIC features.   NewTypes  may  be
  5399. defined which are a collection of several standard types.  a single  NewType
  5400. variable  can  contain  an  assortment ol' numeric  and  string  information
  5401. similar to structures in C.
  5402.  
  5403. List  arrays  offer the programmer more control over standard arrays,   they
  5404. are  also  much  t:aster to manipulate.  Blitz contains  many  commands  for
  5405. operating on linked lists of data.
  5406.  
  5407. Let Var=Expression
  5408.  
  5409. Let  is an optional command used t<> assign a value to a variable.  Let must
  5410. always be followed by a variable name and an expression. Normally, an equals
  5411. sign ('=')  is placed between the variable name and the expression.  If  the
  5412. equals sign is omitted,  then an opertor (eg:  '+', '*') must appear between
  5413. the variable name and the expression.  In this case,  the specified variable
  5414. will be altered by the specified operator and expression.
  5415.  
  5416. Exchange Var,Var
  5417.  
  5418. Exchange  will  'swap'  the values contained in the 2  specified  variables.
  5419. Exchange may only be used with 2 variables of the same type.
  5420.  
  5421. MaxLen StringVar=Expression
  5422.  
  5423. MaxLen  sets  aside a block c>f memory for a string variable to  grow  into.
  5424. This  is normally only necessary in the case of special Blitz commands which
  5425. require this space to be present before execution.  Currently,  only 2 Blitz
  5426. commands require the use of MaxLen - FileRequest$ and Fields.
  5427.  
  5428. DEFTYPE . Typename [Var[, Var...]]
  5429.  
  5430. DEFTYPE  may be used to declare a list of variables as being of a particular
  5431. type. In this case, Var parameters must be supplied.
  5432.  
  5433. DEFTYPE  may  also  be  used to select a default variable  type  for  future
  5434. 'unknown'  variables.   Unknown variables  are  variables  created  with  no
  5435. Typename specifier. In this case, no Var parameters are supplied.
  5436.  
  5437. Page 101
  5438.  
  5439. NEWTYPE.Typename
  5440.  
  5441. NEWTYPE  is used to create a custom variable type.  NEWTYPE must be followed
  5442. by  a  list  of  entry  names  separated by colons (':')   and/or  newlines.
  5443. NEWTYPEs are terminated using End NEWTYPE.
  5444.  
  5445. SizeOf.Typename[,Entrypath]
  5446.  
  5447. SizeOf allows you to determine the amount of memory,  in bytes, a particular
  5448. variable  type  takes  up.   SizeOf may also  be  followed  by  an  optional
  5449. Entrypath,   in  which case the offset from the start of  the  type  to  the
  5450. specified entry is returned.
  5451.  
  5452. Dim Arrayname [List] (Dimensionl[,Dimension2...])
  5453.  
  5454. Dim  is  used to initialize a BASIC array.  Blitz supports 2 array  types  -
  5455. simple  arrays,  and list arrays.  The optional List parameter,  if present,
  5456. denotes a list array.  Simple arrays are identical to standard BASIC arrays,
  5457. and may be of any number dimensions. List arrays may be of only I dimension.
  5458.  
  5459.  
  5460. ResetList Arraynam()
  5461.  
  5462. ResetList  is  used  in conjunction with a list array to  prepare  the  list
  5463. array  for  NextItem  processing.  After executing a  ResetList,   the  next
  5464. Nextitem  executed  will set the list array's 'current element'  pointer  to
  5465. the list array's very first
  5466.  
  5467. ClearList Arraynam()
  5468.  
  5469. ClearList is used in conjunction with list arrays to completely 'empty'  out
  5470. the  specified list array.  List arrays are automatically emptied when  they
  5471. are Dimmed.
  5472.  
  5473. AddFirst (Arrayname())
  5474.  
  5475. The  AddFirst  function  allows you to insert an  array  list  item  at  the
  5476. beginning  of an array list.  AddFirst returns a true/false value reflecting
  5477. whether  or  not there was enough room in the array list to add an  element.
  5478. If an array element was available,  AddFirst returns a true value (-1),  and
  5479. sets the list array's 'current item' pointer to the item added.  If no array
  5480. element was available, AddFirst returns false (0).
  5481.  
  5482. AddLast (Arrayname())
  5483.  
  5484. The  AddLast function allows you to insert an array list item at the end  of
  5485. an array list.  AddLast returns a true/false value reflecting whether or not
  5486. there  was  enough room in the array list to add an element.   If  an  array
  5487. element was available,  AddLast returns a true value (- I ),  and  sets  the
  5488. list  array's 'current item' pointer to the item added.  If no array element
  5489. was available, AddLast returns false (0).
  5490.  
  5491. Page 102
  5492.  
  5493. Additem (Arrayname())
  5494.  
  5495. The  AddItem function allows you to insert an array list item after the list
  5496. array's  'current'  item.   AddItem returns a  true/false  value  reflecting
  5497. whether  or  not there was enough room in the array list to add an  element.
  5498. If  an array element was available,  Additem returns a true value (-l),  and
  5499. sets the list array's 'current item' pointer to the item added.  If no array
  5500. element was available, Additem returns false (0).
  5501.  
  5502. KillItem ArrayName()
  5503.  
  5504. KillItem  is used to delete the specified list array's current item.   After
  5505. executing KillItem,  the list array's 'current item' pointer will be set  to
  5506. the item before the item deleted.
  5507.  
  5508. Previtem (Arrayname())
  5509.  
  5510. Previtem will set the specified list array's 'current item' pointer  to  the
  5511. item  before the list array's old current item.  This allows for 'backwards'
  5512. processing of a list array.  Previtem returns a true/false value  reflecting
  5513. whether or not there actually was a previous item.  If a previous  item  was
  5514. available,   PrevItem  will return true (- l ).  Otherwise,   PrevItem  will
  5515. return false (0).
  5516.  
  5517. Nextitem (Arrayname())
  5518.  
  5519. Nextitem will set the specified list array's 'current item' pointer  to  the
  5520. item  after  the list array's old current item.  This allows for  'forwards'
  5521. processing of a list array.  Nextitem returns a true/false value  reflecting
  5522. whether or not there actually was a next item available or not.  If an  item
  5523. was available,  Nextitem will return true (- l ).  Otherwise,  Nextitem will
  5524. return false (0).
  5525.  
  5526. Firstitem (Arrayname())
  5527.  
  5528. Executing  Firstitem  will  set the specified list  array's  'current  item'
  5529. pointer to the very first item in the list array.  If there are no items  in
  5530. the list array,  Firstitem will return false (0)  otherwise,  Firstitem will
  5531. return true (-l).
  5532.  
  5533. Lastitem (Arrayname())
  5534.  
  5535. Executing  Lastitem  will  set the specified  list  array's  'current  item'
  5536. pointer to the very last item in the list array.  If there are no  items  in
  5537. the  list  array,  Lastitem will return false (0),  otherwise Lastitem  will
  5538. return true (- l ).
  5539.  
  5540. Pushitem Arrayname()
  5541.  
  5542. Executing Pushitem causes the specified list array's 'current item'  pointer
  5543. to be pushed onto an internal stack.  This pointer may be later recalled  by
  5544. executing  Popitem.  The internal item pointer stack is  set  for  up  to  8
  5545. 'pushes'.
  5546.  
  5547. Popitem Arrayname()
  5548.  
  5549. Popitem 'pops' or 'recalls' a previously pushed current item pointer for the
  5550. specified  list array.  Arrayname()  must match the arrayname  of  the  most
  5551. recently executed Pushitem.
  5552.  
  5553. Page 103
  5554.  
  5555. ItemStackSize Max Items
  5556.  
  5557. ItemStackSize  determines how many 'list' items may  be  pushed  (using  the
  5558. Pushltem  command),  before items must be 'Pop'ped off again.  For  example,
  5559. executing ItemStackSize 10()0 will allow you to push up to 1000  list  items
  5560. before you run out of item stack space.
  5561.  
  5562. SortList Arrayname()
  5563.  
  5564. The  SortList command is used to rearrange the order of elements in a  Blitz
  5565. linked  list.  The order in which the items are sorted depends on the  first
  5566. field  of the linked list type which must be a single integer word.  Sorting
  5567. criteria will be extended in future releases.
  5568.  
  5569. Sort Arrayname()
  5570.  
  5571. Sort will cause the specified array to be sorted.
  5572.  
  5573. The  direction  of  the sort may be specified using  either  the  SortUp  or
  5574. SortDown commands. The default direction used for sorting is ascending - ie:
  5575. array elements are sorted into a 'low to high' order.
  5576.  
  5577. SortUp
  5578.  
  5579. SortUp  may be used to force the Sort command to sort arrays into  ascending
  5580. order.  This means that,  after being sorted,  an array's contents  will  be
  5581. ordered in a 'low to high' manner.
  5582.  
  5583. SortDown
  5584.  
  5585. SortDown  may  be  used  to  force the Sort  command  to  sort  arrays  into
  5586. descending order.  This means that,  after being sorted, an array's contents
  5587. will be ordered in a 'high to low' manner.
  5588.  
  5589. Page 104
  5590.  
  5591. R-3: INPUTOUTPUT COMMANDS
  5592.  
  5593. Input  Output is essential for programs to function.  Input includes reading
  5594. data  from  both disk files and data statements and getting input  from  the
  5595. user.  Output options include writing data to files,  displaying information
  5596. on the screen and so on.
  5597.  
  5598. Input  and  Output  are  most commonly acheived  with  the  Edit  and  Print
  5599. commands,   Edit  replacing  the  standard  BASIC  Input  nomenclature.   An
  5600. assortment  of commands are available to redirect input and  output  to  and
  5601. from Files,  Windows etc. Refer to the File and Window handling sections for
  5602. more information.
  5603.  
  5604. Those  developing  games in Blitz should refer to the  BlitzIO  section  for
  5605. Input Output commands more suited to their particular requirements.
  5606.  
  5607. Print Expression[,Expresion...]
  5608.  
  5609. Print  allows you to output either strings or numeric values to the  current
  5610. output channel.  Commands such as WindowOutput or BitMapOutput may  be  used
  5611. to alter the current output channel.
  5612.  
  5613. NPrint Expression[, Expresion...]
  5614.  
  5615. NPrint  allows you to output either strings or numeric values to the current
  5616. output channel.  Commands such as WindowOutput or BitMapOutput may  be  used
  5617. to alter the current output channel.
  5618.  
  5619. After  all  Expressions  have been output,  NPrint  automatically  prints  a
  5620. newline character.
  5621.  
  5622. Format FormatString
  5623.  
  5624. Format  allows you to control the output of any numeric values by the  Print
  5625. or  NPrint  commands.   FormatString is  an  80  character  or  less  string
  5626. expression  used  for formatting information by the Print command.   Special
  5627. characters  in  FormatString   are   used   to  perform  special  formatting
  5628. functions. These special characters are:
  5629.  
  5630. Char    Format effect
  5631.  
  5632. #        If no digit to print, insert spaces into output
  5633. 0        If no digit to print, insert zeros ('0') into output
  5634.         Insert decimal point into output
  5635. +        Insert sign of value
  5636.         Insert sign of value, only if negative
  5637. ,        Insert commas every 3 digits to left of number
  5638.  
  5639. Any other characters in FormatString will appear at appropriate positions in
  5640. the output. Format also affects the operation of the Str$ function.
  5641.  
  5642. Page 105
  5643.  
  5644. FloatMode Mode
  5645.  
  5646. FloatMode allows you to control how floating point numbers are output by the
  5647. Print or NPrint commands.
  5648.  
  5649. Floating  point numbers may he displayed in one of two ways - in exponential
  5650. fon1lat, or in standard format. Exponential format displays a floating point
  5651. number as a value multiplied by ten raised to a power.  For example,   10240
  5652. expressed exponentially is displayed as '1.024E+4',  ie:  1.024 times 10  to
  5653. the power of 4. Standard format simply prints values 'as is'.
  5654.  
  5655. A  Mode  parameter  of  I  will cause floating point  values  to  ALWAYS  be
  5656. displayed h1 exponential format. A Mode parameter of - I will cause floating
  5657. point values to ALWAYS be displayed in standard format.  A Mode parameter of
  5658. 0  will cause Blitz to take a 'best guess' at the most appropriate format to
  5659. use. This is the default mode for floating point output.
  5660.  
  5661. Note  that  if Format has been used to alter numeric output,  standard  mode
  5662. will always be used to print floating point numbers.
  5663.  
  5664. Data [.Type]ltem[ltem...]
  5665.  
  5666. The  Data  statement  allows  you  to include  pre-defined  values  in  your
  5667. programs.   These 'data items' may be transferred into variables  using  the
  5668. Read  statement.  When data is read into variables,  the Type  of  the  data
  5669. being read MUST match the type of the variable it is being read into
  5670.  
  5671. Read Var[,Var...]
  5672.  
  5673. Read  is used to transfer items in Data statements into variables.  Data  is
  5674. transferred  sequentially into variables through what is known  as  a  'date
  5675. pointer'.   Each  time  a  piece of data  is  read,   the  data  pointer  is
  5676. incremented to point at the next piece of data.  The data pointer may be set
  5677. to point to a particular piece of data using the Restore command.
  5678.  
  5679. Restore [Program Label]
  5680.  
  5681. Restore  allows you to set Blitz's internal 'data pointer' to  a  particular
  5682. piece of data.  after executing a Restore,  The first item of data following
  5683. the  specified Program Label will become the data to be read when  the  next
  5684. Read  command is executed.  Restore with no parameters will reset  the  data
  5685. pointer to the very first piece of data in the program.
  5686.  
  5687. Edit$ ([DefaultString$],Characters)
  5688.  
  5689. Edit$  is  Blitz's standard text input command.  When used with  Window  and
  5690. BitMap  Input Edit$ causes the optional DefaultString$ and a  cursor  to  be
  5691. printed  to  the display.  It then waits for the user to hit RETURN.   Edit$
  5692. returns the text entered by the program user as a string of character.
  5693.  
  5694. During  FileInput Edit$ reads the next n characters from the  open  file  or
  5695. until the next endofline character (chr$(10)).  To read data from files that
  5696. is  not  standard  ascii  (ignore EOL terminators)  Inkey$  should  be  used
  5697. instead  of  Edit$.   Characters specifies a  maximum  number  of  allowable
  5698. characters  for  input.  This is extremely useful in preventing  Edit$  from
  5699. destroying display contents.
  5700.  
  5701. Page 106
  5702.  
  5703.  
  5704.  
  5705. Edit ([DefaultValue],Characters)
  5706.  
  5707. Edit is Blitz's standard numeric input command. The same characteristics
  5708. apply as those for Edit$ however Edit of course only accepts numeric input.
  5709.  
  5710. lnkey$ [(Characters)]
  5711.  
  5712. Inkey$ may be used to collect one or more characters from the current  input
  5713. channel.  The current input channel may be selected using commands  such  as
  5714. WindowInput,  Filelnput or BitMapInput.  Inkey$ MAY NOT  he  used  from  the
  5715. Defaultinput  input  channel as the CLI does not  pass  input  back  to  the
  5716. program  until  the user hits return.  Characters refers to  the  number  of
  5717. characters to collect. The default is one character.
  5718.  
  5719. Defaultinput
  5720.  
  5721. Detaultinput causes all future Edit$ and Inkey$ functions to  receive  their
  5722. input  from  the  CLI window the Blitz program was run from.   This  is  the
  5723. default input channel used when a Blitz program is first run.
  5724.  
  5725. DefaultOutput
  5726.  
  5727. DefaultOutput cause all future Print statements to send their output to  the
  5728. CLI  window  the  Blitz program was run from.  This is  the  default  output
  5729. channel used when a Blitz program is first run.
  5730.  
  5731. FileRequest$ (Title$, Pathname$, Filename$)
  5732.  
  5733. The FileRequest$ function will open up a standard Amiga-style file requester
  5734. on  the currently used screen.  Program flow will halt until the user either
  5735. selects  a file,  or hits the requester's 'Cancel' button.  If  a  file  was
  5736. selected,   FileRequest$ will return the full file name  as  a  string.   If
  5737. 'Cancel' was selected, FileRequest$ will return a null (empty) string.
  5738.  
  5739. Title$  may  be  any string expression to be used as a title  for  the  file
  5740. requester.  Pathname$ MUST be a string variable with a MaxLen  of  at  least
  5741. 160. Filename$ MUST be a string variable with a MaxLen of at least 64.
  5742.  
  5743. Popinput
  5744.  
  5745. After input has been re-directed (eg using WindowInput/Filelnput),  Popinput
  5746. may be used to return the channel to it's previous condition.
  5747.  
  5748. PopOutput
  5749.  
  5750. After  output  has  been  re-directed  (eg  using  WindowOutput/FileOutput),
  5751. PopOutput may be used to return the channel to it's previous condition.
  5752.  
  5753. Joyx (Port)
  5754.  
  5755. Joyx  will  return  the  left/right status of a joystick  plugged  into  the
  5756. specified port.  Port must be either 0 or 1,  0 being the port the mouse  is
  5757. normally  plugged  into.  If the joystick is held to the  left,   Joyx  will
  5758. return -1.  If the joystick is held to the right, Joyx will return 1. If the
  5759. joystick is held neither left or right, Joyx will return 0.
  5760.  
  5761. Page 107
  5762.  
  5763. Joyy (Port)
  5764.  
  5765. Joyy will return the up/down status of a joystick plugged into the specified
  5766. port.   Port must be either O or 1,  0 being the port the mouse is  normally
  5767. plugged into.  If the joystick is held upwards,  Joyy will return -1. If the
  5768. joystick  is held downwrads,  Joyy will return 1.  If the joystick  is  held
  5769. neither upwards or downwards, Joyy will return 0.
  5770.  
  5771. Joyr (Port)
  5772.  
  5773. Joyr may be used to determine the rotational direction of a joystick plugged
  5774. into the specified port.  Port must be either O or 1,  port 0 being the port
  5775. the  mouse is normally plugged into.  Joyr returns a value from O through  8
  5776. based on the following table:
  5777.  
  5778.     Direction        Value
  5779.     Up            O
  5780.     Up-Right        1
  5781.     Right            2
  5782.     Down-Right        3
  5783.     Down            4
  5784.     Down-Left        5
  5785.     Left            6
  5786.     Up-Left            7
  5787.     No Direction    8
  5788.  
  5789. Joyb (Port)
  5790.  
  5791. Joyb  allows  you to read the button status of the device plugged  into  the
  5792. specified port.  Port must be either O or 1,  0 being the port the mouse  is
  5793. normally plugged into.  If the left button is held down, Joyb will return I.
  5794. If  the right button is held down,  Joyb will return 2.  If both buttons are
  5795. held  down,   Joyb will return 3.  If no buttons are held down,   Joyb  will
  5796. return 0.
  5797.  
  5798. GameB (Port#)
  5799.  
  5800. GameB  returns the button states of CD32 style game controllers.  The values
  5801. of  all buttons pressed are added together to make up the value returned  by
  5802. GameB.  To check a certain button is down a logical AND should be performed,
  5803. buttonvalue  AND returnvalue will evaluate to O if the button  is  not  held
  5804. down. The button values are:
  5805.  
  5806. .Button            Value
  5807.     
  5808. Play/Pause        1
  5809. Reverse            2        
  5810. Forward            4
  5811. Green            8
  5812. Yellow            16
  5813. Red            32
  5814. Blue            64
  5815.  
  5816.  
  5817. Page 108
  5818.  
  5819.  
  5820.  
  5821. R-4: FILE HANDLING & IFF INFO COMMANDS
  5822.  
  5823. Blitz supports 2 modes of file access - sequential,  and random access.  The
  5824. following section covers the Blitz commands that open,  close and operate on
  5825. these two types of files.
  5826.  
  5827. Blitz  also  contains  special commands for finding information  about  ILBM
  5828. files  which are standard on the Amiga for containing graphics in  the  form
  5829. of bitmaps and brushes.
  5830.  
  5831. For  specialised commands that read and write graphics and sound files  more
  5832. information  and  command  descriptions are  available  in  the  appropriate
  5833. sections.
  5834.  
  5835. OpenFile (File#,Filename$)
  5836.  
  5837. OpenFile attempts to open the file specified by Filename$.  If the file  was
  5838. successfully opened,  OpenFile will return true (-l),  otherwise,   OpenFile
  5839. will return false (0).
  5840.  
  5841. Files  opened using OpenFile may be both written to and read from.   If  the
  5842. file  specified  by Filename$,  did not already exist before  the  file  was
  5843. opened, it will be created by OpenFile.
  5844.  
  5845. Files  opened with OpenFile are intended for use by the random  access  file
  5846. commands,   although it is quite legal to use these files  in  a  sequential
  5847. manner.
  5848.  
  5849. ReadFile (File#,Filename$)
  5850.  
  5851. ReadFile  opens  an  already  existing   file  specified  by  Filename$  for
  5852. sequential reading.  If the specified file was successfully opened, ReadFile
  5853. will return true (-l), otherwise ReadFile will return false (0).
  5854.  
  5855. Once  a  file  is  open  using ReadFile,  FileInput  may  be  used  to  read
  5856. information from it.
  5857.  
  5858. WriteFile (File#,Filename$)
  5859.  
  5860. WriteFile creates a new file,  specified by Filename$,  for the  purpose  of
  5861. sequential file writing. If the file was successfully opened, WriteFile will
  5862. return true (- l ), otherwise, WriteFile will return false (0).
  5863.  
  5864. A  file  opened  using WriteFile may be written to by using  the  FileOutput
  5865. command.
  5866.  
  5867. CloseFile File#
  5868.  
  5869. CloseFile  is  used  to  close a file opened using  one  of  the  file  open
  5870. functions (FileOpen,  ReadFile, WriteFile). This should be done to all files
  5871. when they are no longer required.
  5872.  
  5873. Fields File#, Var[, Var...]
  5874.  
  5875. Fields is used to set up fields of a random access file record.  Once Fields
  5876. is  executed,  Get and Put may be used to read and write information to  and
  5877. from  the file.  The Var parameters specify a list of variables you wish  to
  5878. be either read from,
  5879.  
  5880. Page 109
  5881.  
  5882. or written to the file.
  5883.  
  5884. When  a  Put  is  executed,   the values held in  these  variables  will  be
  5885. transferred to the file.  When a Get is executed,  these variables will take
  5886. on values read from the file.
  5887.  
  5888. Any  string  variables in the variable list MUST have  been  initialized  to
  5889. contain  a  maximum  number of characters.  This is done  using  the  MaxLen
  5890. command.   These  string variables must NEVER grow to be longer  than  their
  5891. defined maximum length.
  5892.  
  5893. Put File#,Record
  5894.  
  5895. Put is used to transfer the values contained in a Fields variable list to  a
  5896. particular  record in a random access file.  When using Put to increase  the
  5897. size  of  a  random access file,  you may only add to the immediate  end  of
  5898. file.  For example,  if you have a random access file with 5 records in  it,
  5899. it  is illegal to put record number 7 to the file until record number 6  has
  5900. been created.
  5901.  
  5902. Get File#,Record
  5903.  
  5904. Get  is  used to transfer information from a particular record of  a  random
  5905. access file into a variable list set up by the Fields command.  Only records
  5906. which also exist may be'got'.
  5907.  
  5908. FileOutput File#
  5909.  
  5910. The  FileOutput command causes the output of all subsequent Print and NPrint
  5911. commands to be sent to the specified sequential file. When the file is later
  5912. closed, Print statements should be returned to an appropriate output channel
  5913. (eg: DefaultOutput or WindowOutput).
  5914.  
  5915. Filelnput File#
  5916.  
  5917. The FileInput command causes all subsequent Edit,  Edit$ and Inkey$ commands
  5918. to  receive  their input from the specified file.  When the  file  is  later
  5919. closed,   input  should  be  redirected   to  an  appropriate  channel  (eg:
  5920. DefaultInput or WindowInput).
  5921.  
  5922. FileSeek File#,Position
  5923.  
  5924. FileSeek  allows  you to move to a particular point in the  specified  file.
  5925. The  first piece of data in a file is at position 0,  the second at position
  5926. I and so on.  Position must not be set to a value greater than the length of
  5927. the file.
  5928.  
  5929. Used in conjunction with OpenFile and Lof,  FileSeek may be used to 'append'
  5930. to a file.
  5931.  
  5932. Lof (File#)
  5933.  
  5934. Lof will return the length, in bytes, of the specified file.
  5935.  
  5936. Eof (File#)
  5937.  
  5938. The Eof function allows you to determine if you are currently positioned  at
  5939. the end of the specified file.  If so,  Eof will return true (-1), otherwise
  5940. Eof will return false (0).
  5941.  
  5942. Page 110
  5943.  
  5944. If  you  are  at  the end of a file,  any further writing to the  file  will
  5945. increase it's length,  while any further reading from the file will cause an
  5946. error.
  5947.  
  5948. Loc (File#)
  5949.  
  5950. Loc  may  be used to determine your current position in the specified  file.
  5951. When a file is first opened, you will be at position O in the file.
  5952.  
  5953. DosBuffLen Bytes
  5954.  
  5955. All  Blitz  file  handling  is done through the  use  of  special  buffering
  5956. routines.   This is done to increase the speed of file handling,  especially
  5957. in the case of sequential files.
  5958.  
  5959. Initially,  each file opened is allocated a 2048 byte buffer.  However,   if
  5960. memory  is  tight  this  buffer  size may be lowered  using  the  DosBuffLen
  5961. command.
  5962.  
  5963. KillFile Filename$
  5964.  
  5965. The  KillFile command will simply attempt to delete the specified file.   No
  5966. error will be returned if the file could not be deleted.
  5967.  
  5968. CatchDosErrs
  5969.  
  5970. Whenever you are executing AmigaDos I/O (for example,  reading or writing  a
  5971. file),   there  is  always  the possibility of something  going  wrong  (for
  5972. example,  disk not inserted...  read/write error etc.).  Normally, when such
  5973. problems  occur,  AmigaDos displays a suitable requester  on  the  WorkBench
  5974. window.  However, by executing CatchDosErrs you can force such requesters to
  5975. open on a Blitz window.
  5976.  
  5977. The  window you wish dos error requesters to open on should be the currently
  5978. used window at the time CatchDosErrs is executed.
  5979.  
  5980. ReadMem File#,Address,Length
  5981.  
  5982. ReadMem allows you to read a number of bytes,  determined by Length, into an
  5983. absoulte  memory  location,   determined by  Address,   from  an  open  file
  5984. specified by File#.
  5985.  
  5986. Be  careful  using ReadMem,  as writing to absolute memory may have  serious
  5987. consequences if you don't known what you're doing!
  5988.  
  5989. WriteMem File#,Address,Length
  5990.  
  5991. WriteMem allows you to write a number of bytes,  determined by Length,  from
  5992. an  absolute  memory  location,  determined by Address,   to  an  open  file
  5993. specified by File#.
  5994.  
  5995. Exists (FileName$)
  5996.  
  5997. Exists actually returns the length of the file,  unlike Lof()  Exists()   is
  5998. for files that have not already been opened.  If O the file either does  not
  5999. exist  or  is  empty  or is perhaps not a file at all!   Hmmm,   anyway  the
  6000. following poke turns off the "Please Insert Volume Blah:" requester  so  you
  6001. can use Exists to wait for disk changes:
  6002.  
  6003. Poke.l Peek.l(Peek.1(4)+276)+184,-1
  6004.  
  6005. Page 111
  6006.  
  6007. ILBMlnfo Filename$
  6008.  
  6009. ILBMInfo  is used to examine an ILBM file.  Once ILBMInfo has been executed.
  6010. ILBMWidth,   ILBMHeight and ILBMDepth may be used to examine  properties  of
  6011. the image contained in the file.
  6012.  
  6013. ILBMWidth
  6014.  
  6015. ILBMWidth will return the width,  in pixels,  of an ILBM image examined with
  6016. ILBMInfo.
  6017.  
  6018. ILBMHeight
  6019.  
  6020. ILBMHeight  will return the height,  in pixels,  of an ILBM  image  examined
  6021. with ILBMInfo.
  6022.  
  6023. ILBMDepth
  6024.  
  6025. ILBMDepth  wil1 return the depth,  in bitplanes,  of an ILBM image  examined
  6026. with ILBMInfo.
  6027.  
  6028. ILBMViewMode
  6029.  
  6030. ILBMViewMode  returns  the  viewmode of  the  file  that  was  processed  by
  6031. ILBMInfo. This is useful for opening a screen in the right mode before using
  6032. LoadScreen  etc.   The different values of ViewMode are as  follows  (add/or
  6033. them for different combinations):
  6034.  
  6035.     Mode        Value
  6036.     HiRes        32768
  6037.     Ham        2048
  6038.     HalfBrite    128
  6039.     Interlace    4
  6040.     LoRes        0
  6041.  
  6042. Page 112
  6043.  
  6044.  
  6045. R-5: NUMERIC & STRING FUNCTIONS
  6046.  
  6047. This section covers all Blitz functions which accept and return numeric  and
  6048. string values.  Note that all the transcendental functions (eg.  Sin,   Cos)
  6049. operate in radians.
  6050.  
  6051. Functions  that  return information about system time and  date.   workbench
  6052. parameters and so forth are also listed in this section.
  6053.  
  6054. True
  6055.  
  6056. True is a system constant with a value of -1.
  6057.  
  6058. False
  6059.  
  6060. False is a system constant with a value of 0.
  6061.  
  6062. NTSC
  6063.  
  6064. This function returns O if the display is currently in PAL mode,  or  -I  if
  6065. currently  in  NTSC  mode.   This  may  be  used  to  write  software  which
  6066. dynamically adjusts itself to different versions of the Amiga computer.
  6067.  
  6068. DispHeight
  6069.  
  6070. DispHeight will return 256 if executed on a PAL Amiga, or 200 if executed on
  6071. an NTSC Amiga.  This allows programs to open full sized screens, windows etc
  6072. on any Amiga.
  6073.  
  6074. VPos
  6075.  
  6076. VPos  returns the video's beam vertical position.  Useful in both  highspeed
  6077. animation where screen update may need to be synced to a certain video  beam
  6078. position  (not just the top of frame as with VWait)  and for a  fast  random
  6079. nember generator in non frame-synced applications.
  6080.  
  6081. Peek [.Type](Address)
  6082.  
  6083. The  Peek  function  returns the contents of the  absolute  memory  location
  6084. specified  by  Address.   The  optional Type  parameter  allows  peeking  of
  6085. different sizes.  For example, to peek a byte, you would use Peek.b; to peek
  6086. a word, you would use Peek.w; and to peek a long, you would use Peek.l
  6087.  
  6088. It is also possible to peek a string using Peek$.  This will return a string
  6089. of  characters read from consecutive memory locations until a byte of  O  is
  6090. found.
  6091.  
  6092. Abs (Expression)
  6093.  
  6094. This function returns the positive equivalent of Expression.
  6095.  
  6096. Frac (Expression)
  6097.  
  6098. Frac() returns the fractional part of Expression.
  6099.  
  6100. Page 113
  6101.  
  6102. Int (Expression)
  6103.  
  6104. This returns the Integer part (before the decimal point) of Expression.
  6105.  
  6106. OAbs (Ouick)
  6107.  
  6108. QAbs  works just like Abs except that the value it accepts is a Quick.  This
  6109. enhances  the  speed at which the function executes quite dramatically.   Of
  6110. course you are limited by the restrictions of the quick type of value.
  6111.  
  6112. QFrac (Ouick)
  6113.  
  6114. QFrac()  returns the fractional part of a quick value.  It works like Frac()
  6115. but  accepts a quick value as it's argument.  It is faster than Frac()   but
  6116. has the normal quick value limits.
  6117.  
  6118. OLimit (Ouick,Low,High)
  6119.  
  6120. QLimit  is  used to limit the range of a quick number.  If Quick is  greater
  6121. than or equal to Low,  and less than or equal to High, the value of Quick is
  6122. returned.  If Quick is less than Low,  then Low is returned.   If  Quick  is
  6123. greater than High, then High is returned.
  6124.  
  6125. QWrap (Ouick,Low,High)
  6126.  
  6127. QWrap will wrap the result of the Quick expression if Quick is greater  than
  6128. or equal to high,  or less than low.  If Quick is less than Low, then Quick-
  6129. Low+High is returned. If Quick is greater than or equal to High, then Quick-
  6130. High+Low is returned.
  6131.  
  6132. Rnd [(Range)]
  6133.  
  6134. This  function  returns a random number.  If Range is not specified  then  a
  6135. random decimal is returned between O and 1.  If Range is specified,  then  a
  6136. decimal value between O and Range is returned.
  6137.  
  6138. Sgn (Expression)
  6139.  
  6140. Sgn returns the sign of Expression.  If Expression is less than 0,  then - I
  6141. is returned.  If Expression is equal to 0, then O is returned. If Expression
  6142. is greater than 0, then I is returned.
  6143.  
  6144. Cos (Float)  Cos()  returns the Cosine of the value Float.  Sin (Float) This
  6145. returns the Sine of the value Float.
  6146.  
  6147. Tan (Float)
  6148.  
  6149. This returns the Tangent of the value Float.
  6150.  
  6151. Page 114
  6152.  
  6153. ACos (Float)
  6154.  
  6155. This returns the ArcCosine of the value Float.
  6156.  
  6157. ASin (Float)
  6158.  
  6159. This returns the ArcSine of the value Float.
  6160.  
  6161. ATan (Float)
  6162.  
  6163. This returns the ArcTangent of the value Float.
  6164.  
  6165. HCos (Float)
  6166.  
  6167. This returns the hyperbolic Cosine of the value Float.
  6168.  
  6169. HSin (Float)
  6170.  
  6171. This returns the hyperbolic Sine of the value Float.
  6172.  
  6173. HTan (Float)
  6174.  
  6175. This returns the hyperbolic Tangent of the value Float.
  6176.  
  6177. Exp (Float)
  6178.  
  6179. This returns e raised to the power of Float.
  6180.  
  6181. Sqr (Float)
  6182.  
  6183. This returns the square root of Float.
  6184.  
  6185. LoglO (Float)
  6186.  
  6187. This returns the base 101ogarithm of Float.
  6188.  
  6189. Log (Float)
  6190.  
  6191. This returns the natural (base e) logarithm of Float.
  6192.  
  6193. QAngle (Src X,Src Y,Dest X,Dest Y)
  6194.  
  6195. QAngle returns the angle between the two 2D coordinates passed.  the angle.q
  6196. returned is a value from 0..1,  I representing 360 degrees in standard polar
  6197. geometry.
  6198.  
  6199. Left$ (String$,Length)
  6200.  
  6201. This function returns the Length leftmost characters of string String$.
  6202.  
  6203. Right$ (String$,Length)
  6204.  
  6205. Right$() returns the rightmost Length characters from string String$.
  6206.  
  6207. Page 115
  6208.  
  6209.  
  6210.  
  6211. Mid$ (String$,Startchar[ Length])
  6212.  
  6213. This  function  returns  Length characters of  string  String$  starting  at
  6214. character Startchar.  If the optional Length parameter is omitted,  then all
  6215. characters from Startchar up to the end of String$ will be returned.
  6216.  
  6217. Hex$ (Expression)
  6218.  
  6219. Hex$()   returns  an  8  character  string  equivalent  to  the  hexadecimal
  6220. representation of Expression.
  6221.  
  6222. Bin$ (Expression)
  6223.  
  6224. Hex$()   returns   a   32   character   string   equivalent  to  the  binary
  6225. representation of Expression.
  6226.  
  6227. Chr$ (Expression)
  6228.  
  6229. Chr$  returns  a  one  character string equivalent to  the  ASCII  character
  6230. Expression.Ascii  is  a standard way of coding the characters  used  by  the
  6231. computer display.
  6232.  
  6233. Asc (String$)
  6234.  
  6235. Asc() returns the ASCII value of the first characters in the string String$.
  6236. String$ (String$,Repeats)
  6237.  
  6238. This  function  will  return   a   string   containing   Repeats  sequential
  6239. occurrences of the string String$.
  6240.  
  6241. Instr (String$,Findstring$[,Startpos])
  6242.  
  6243. Instr  attempts to locate FindString$ within String$.  If a match is  found,
  6244. the character position of the first matching character will be returned.  If
  6245. no match is found, O will be returned.
  6246.  
  6247. The  optional Startpos parameter allows you to specify a starting  character
  6248. position for the search.
  6249.  
  6250. CaseSense  may be used to determine whether the search is case sensitive  or
  6251. not.
  6252.  
  6253. Replace$ (String$,Findstring$,Replacestring$)
  6254.  
  6255. Replace$()  will search the string String$ for any occurrences of the string
  6256. Findstring$ and replace it with the string Replacestring$.
  6257.  
  6258. CaseSense  may be used to determine whether the search is case sensitive  or
  6259. not.
  6260.  
  6261. Mki$ (Integer)
  6262.  
  6263. This  will  create a two byte character string,  given the two byte  numeric
  6264. value  Numeric.   Mki$  is  often  used before  writing  integer  values  to
  6265. sequential files to save on disk space.  When the file is later read in, Cvi
  6266. may be used to convert the string back to an integer.
  6267.  
  6268. Page 116
  6269.  
  6270. Mk|$ (Long)
  6271.  
  6272. This  will create a four byte character string,  given the four byte numeric
  6273. value Long.  Mkl$ is often used when writing long values to sequential files
  6274. to save on disk space.  When the file is later read in,  Cvl may be used  to
  6275. convert the string back to a long.
  6276.  
  6277. Mkq$ (Quick)
  6278.  
  6279. This  will create a four byte character string,  given the four byte numeric
  6280. value  Quick.   Mkq$ is often used when writing quick values  to  sequential
  6281. files  to save on disk space.  When the file is later read in,  Cvq  may  be
  6282. used to convert the string back to a quick.
  6283.  
  6284. Cvi (String$)
  6285.  
  6286. Cvi  returns  an  integer  value equivalent to  the  left  2  characters  of
  6287. String$. This is the logical opposite of Mki$.
  6288.  
  6289. Cvl (String$)
  6290.  
  6291. Cvl  returns  a long value equivalent to the left 4 characters  of  String$.
  6292. This is the logical opposite of Mkl$.
  6293.  
  6294. Cvq (String$)
  6295.  
  6296. Cvq  returns a quick value equivalent to the left 4 characters  of  String$.
  6297. This is the logical opposite of Mkq$.
  6298.  
  6299. Len (String$)
  6300.  
  6301. Len returns the length of the string String$.
  6302.  
  6303. UnLeft$ (String$,Length)
  6304.  
  6305. UnLeft$() removes the rightmost Length characters from the string String$.
  6306.  
  6307. UnRight$ (String$,Length)
  6308.  
  6309. UnRight$() removes the leftmost Length characters from the string String$.
  6310.  
  6311. Strip Lead$ (String$, Expression)
  6312.  
  6313. StripLead$ removes all leading occurrences of the ASCII character  specified
  6314. by Expression from the string String$.
  6315.  
  6316. StripTrai 1$ (String$, Expression)
  6317.  
  6318. StripTrail$  removes  all  trailing   occurrences  of  the  ASCII  character
  6319. specified by Expression from the string String$.
  6320.  
  6321. LSet$ (String$, Characters)
  6322.  
  6323. This  function returns a string of Characters characters long.   The  string
  6324. String$
  6325.  
  6326. Page 117
  6327.  
  6328. will be placed at the beginning of this string.  If String$ is shorter  than
  6329. Characters the right hand side is padded with spaces.  If it is longer,   it
  6330. will be truncated.
  6331.  
  6332. RSet$ (String$, Characters)
  6333.  
  6334. This  function returns a string of Characters characters long.   The  string
  6335. String$  will be placed at end of this string.  If String$ is  shorter  than
  6336. Characters the lett hand side is padded with spaces.  If it is  longer,   it
  6337. will be truncated.
  6338.  
  6339. Centre$ (String$,Characters)
  6340.  
  6341. This  function returns a string of Characters characters long.   The  string
  6342. String$  will  be centered in the resulting string.  If String$  is  shorter
  6343. than Characters the left and right sides will be padded with spaces.  If  it
  6344. is longer, it will be truncated on either side.
  6345.  
  6346. LCase$ (String$)
  6347.  
  6348. This function returns the string String$ converted into lowercase.
  6349.  
  6350. UCase$ (Siring$)
  6351.  
  6352. This function returns the string String$ converted to uppercase.
  6353.  
  6354. CaseSense Onl Off
  6355.  
  6356. CaseSense  allows you to control the searching mode used by  the  Instr  and
  6357. Replace$ functions.
  6358.  
  6359. CaseSense On indicates that an exact match must be found.
  6360.  
  6361. CaseSense  Off indicates that alphabetic characters may be matched  even  if
  6362. they are not in the same case.
  6363.  
  6364. CaseSense On is the default search mode.
  6365.  
  6366. Val (String$)
  6367.  
  6368. This  functions converts the string String$ into a numeric value and returns
  6369. this value.  When converting the string, the conversion will stop the moment
  6370. either a non numeric value or a second decimal point is reached.
  6371.  
  6372. Str$ (Expression)
  6373.  
  6374. This returns a string equivalent of the numeric value Expression.  This  now
  6375. allows you to perform string operations on this string.
  6376.  
  6377. If  the Format command has been used to alter numeric output,  this will  be
  6378. applied to the resultant string.
  6379.  
  6380. UStr$ (Expression)
  6381.  
  6382. This returns a string equivalent of the numeric value Expression.  This  now
  6383. allows you to perform string operations on this string.
  6384.  
  6385. Unlike Str$, UStr$ is not affected by any active Format commands.
  6386.  
  6387. Page 118
  6388.  
  6389. SystemDate
  6390.  
  6391. SystemDate  returns  the  system date as the number  of  days  passed  since
  6392. 1/1/1978.
  6393.  
  6394. Date$ (days)
  6395.  
  6396. Date$  converts  the  format  returned  by  SystemDate  (days  passed  since
  6397. 1/1/1978)  into a string format of dd/mm/yyyy or mm/dd/yyyy depending on the
  6398. dateformat (defaults to 0)
  6399.  
  6400. NumDays (date$)
  6401.  
  6402. Numdays converts a Date$ in the above format to the day count format,  where
  6403. numdays is the number of days since 1/1/1978.
  6404.  
  6405. DateFormat format#; O or 1
  6406.  
  6407. DateFormat  configures  the  way  both date$  and  numdays  treat  a  string
  6408. representation of the date: O=dd/mm/yyyy and l=mm/dd/yyyy
  6409.  
  6410. Days
  6411.  
  6412. Days Months and Years each return the particular value relevant to the  last
  6413. call  to  SystemDate.  They are most useful for when the  program  needs  to
  6414. format  the  output of the date other than that produced by date$.   WeekDay
  6415. returns which day of the week it is with Sunday=0 through to Saturday=6.
  6416.  
  6417. Months
  6418.  
  6419. See description of Days.
  6420.  
  6421. Years
  6422.  
  6423. See description of Days.
  6424.  
  6425. WeekDay
  6426.  
  6427. See description of Days.
  6428.  
  6429. Hours
  6430.  
  6431. Hours, Mins and Secs return the time of day when SystemDate was last called.
  6432. Mins
  6433.  
  6434. Hours, Mins and Secs return the time of day when SystemDate was last called.
  6435. Secs
  6436.  
  6437. Hours, Mins and Secs return the time of day when SystemDate was last called.
  6438. Page 119
  6439.  
  6440. WBWidth
  6441.  
  6442. The  functions WBWidth,  WBHeight,  WBDepth & WBViewMode return  the  width,
  6443. height,   depth & viewmode of the current WorkBench screen as configured  by
  6444. preferences.
  6445.  
  6446. WBHeight
  6447.  
  6448. See Description of WBWidth.
  6449.  
  6450. WBDepth
  6451.  
  6452. See Description of WBWidth.
  6453.  
  6454. WBViewMode
  6455.  
  6456. See Description of WBWidth.
  6457.  
  6458. Processor
  6459.  
  6460. The  function  Processor returns the type of processor in  the  computer  on
  6461. which the program is currently running.
  6462.  
  6463. 0=68000
  6464. 1=680l0
  6465. 2=68020
  6466. 3=68030
  6467. 4=68040
  6468.  
  6469. ExecVersion
  6470.  
  6471. The  function ExecVersion returns the relevant information about the  system
  6472. the program is running on.
  6473.  
  6474. 33=1.2
  6475. 34=1.3
  6476. 36=2.0
  6477. 39=3.0
  6478.  
  6479. Page 120
  6480.  
  6481.  
  6482. R-6: COMPILER DIRECTIVES & OBJECT HANDLING
  6483.  
  6484. The  following  section  refers to the Blitz Compiler Directives,   commands
  6485. which  affect  how  a program is compiled.  Conditional compiling,   macros,
  6486. include files and more are covered in this chapter.
  6487.  
  6488. Information  regarding  control of Blitz Objects  is  also  listed  in  this
  6489. section.  Objects are Blitz's way of controlling speicalised data  concerned
  6490. with windows, shapes etc.
  6491.  
  6492. USEPATH Pathtext
  6493.  
  6494. USEPATH allows you to specify a 'shortcut' path when dealing with
  6495. NEWTYPE variables. Consider the following lines of code:
  6496.  
  6497. aliens()\x= 1 60
  6498. al iens()\y= 100
  6499. aliens()\xs= 10
  6500. aliens()\ys=-10
  6501. USEPATH can be used to save you some typing, like so:
  6502. USEPATH aliens()
  6503.  
  6504. \x=160
  6505. \y=100
  6506. \xs=10
  6507. \ys=-10
  6508. Whenever  Blitz encounters a variable starting with the backslash  character
  6509. ('\'), it simply inserts the current USEPATH text before the backslash.
  6510.  
  6511. BLITZ
  6512.  
  6513. The  BLITZ directive is used to enter Blitz mode.  For a full discussion  on
  6514. Amiga/Blitz  mode,  please refer to the programming  chapter  of  the  Blitz
  6515. Programmers Guide.
  6516.  
  6517. AMIGA
  6518.  
  6519. The  AMIGA directive is used to enter Amiga mode.  For a full discussion  on
  6520. Amiga/Blitz  mode,  please refer to the programming  chapter  of  the  Blitz
  6521. Programmers Guide.
  6522.  
  6523. QAMIGA
  6524.  
  6525. The  QAMIGA  directive  is  used to enter Quick  Amiga  mode.   For  a  full
  6526. discussion on Amiga/Blitz mode,  please refer to the programming chapter  of
  6527. the Blitz Programmers Guide.
  6528.  
  6529. INCLUDE Filename
  6530.  
  6531. INCLUDE  is  a  compile  time  directive which causes  the  specified  file,
  6532. Filename,  to be compiled as part of the programs object code. The file must
  6533. be  in tokenised form (de:  saved from the Blitz editor)  - ascii files  may
  6534. not  be  INCLUDE'd.   INCDIR may be used to specify  a  path  for  Filename.
  6535. Filename may be optionally quote enclosed to avoid tokenisation problems.
  6536.  
  6537. Page 121
  6538.  
  6539. XINCLUDE Filename
  6540.  
  6541. XINCLUDE  stands  for  exclusive  include.  XINCLUDE  works  identically  to
  6542. INCLUDE  with  the  exception that XlNCLUDE'd files are only  ever  included
  6543. once.   For example,  if a program has 2 XINCLUDE statements with  the  same
  6544. filename, only the first XINCLUDE will have any effect.
  6545.  
  6546. INCDIR  may  be  used  to  specify a path for  Filename.   Filename  may  be
  6547. optionally quote enclosed to avoid tokenisation problems.
  6548.  
  6549. INCBIN Filename
  6550.  
  6551. INCBIN  allows you to include a binary file in your object  code.   This  is
  6552. mainly  of use to assembler language programmers,  as having big  chunks  of
  6553. binary data in the middle of a BASIC program is not really a good idea.
  6554.  
  6555. INCDIR may be used to specify an AmigaDos path for Filename.
  6556.  
  6557. Filename may be optionally quote enclosed to avoid tokenisation problems.
  6558.  
  6559. INCDIR Pathname
  6560.  
  6561. The INCDIR command allows you to specify an AmigaDos path to be prefixed  to
  6562. any. filenames specified by any of INCLUDE, XINCLUDE or INCBIN commands.
  6563.  
  6564. Pathname may be optionally quote enclosed to avoid tokenisation problems.
  6565.  
  6566. CNIF Constant Comparison Constant
  6567.  
  6568. CNIF allows you to conditionally compile a section of program code based  on
  6569. a  comparison of 2 constants.  Comparison should be one of '<',  '>',   '=',
  6570. '<>',  '<=' or'>='. If the comparison proves to be true, then compiling will
  6571. continue as normal.  If the comparison proves to be false,  then  no  object
  6572. code will be generated until a matching CEND is encountered.
  6573.  
  6574. CEND
  6575.  
  6576. CEND  marks  the end of a block of conditionally compiled code.   CEND  must
  6577. always appear somewhere following a CNIF or CSIF directive.
  6578.  
  6579. CSIF "String" Comparison "String"
  6580.  
  6581. CSIF allows you to conditionally compile a section of program code based  on
  6582. a  comparison of 2 literal strings.  Comparison should be one of '<',   '>',
  6583. '=',   '<>',   '<='  or'>='.  Both strings must be  quote  enclosed  literal
  6584. strings.  If the comparison proves to be true,  then compiling will continue
  6585. as  normal.  If the comparison proves to be false,  then no object code will
  6586. be generated until a matching CEND is encountered.
  6587.  
  6588. CSIF is of most use in macros for checking macro parameters.
  6589.  
  6590. CELSE
  6591.  
  6592. CELSE  may be used between a CNIF or CSIF,  and a CEND to cause code  to  be
  6593. compiled when a constant comparison proves to be false.
  6594.  
  6595. Page 122
  6596.  
  6597. CERR Errormessage
  6598.  
  6599. CERR  allows  a  program to generate compile-time error messages.   CERR  is
  6600. normally  used  in  conjunction with macros  and  conditional  compiling  to
  6601. generate errors when incorrect macro parameters are encountered.
  6602.  
  6603. Macro Macroname
  6604.  
  6605. Macro is used to declare the start of a macro definition. All text following
  6606. Macro,   up  until  the  next End Macro,  will be included  in  the  macro's
  6607. contents.
  6608.  
  6609. End Macro
  6610.  
  6611. End Macro is used to finish a macro definition. Macro definitions are set up
  6612. using the Macro command.
  6613.  
  6614. Runerrson
  6615.  
  6616. These  two  new  compiler directives are for enabling  and  disabling  error
  6617. checking  in different parts of the program,  they override the settings  in
  6618. Compiler Options.
  6619.  
  6620. Runerrsoff
  6621.  
  6622. See description of Runerrson.
  6623.  
  6624. Use Objectname Object#
  6625.  
  6626. Use  will  cause  the Blitz object specified by Objectname  and  Object#  to
  6627. become the currently used object.
  6628.  
  6629. Free Objectname Object#
  6630.  
  6631. Free  is  used to free a Blitz object.  Any memory consumed by the  object's
  6632. existence will be free'd up,  and in the case of things such as windows  and
  6633. screens, the display may be altered.
  6634.  
  6635. Attempting to free a non-existent object will have no effect.
  6636.  
  6637. USED ObjectName
  6638.  
  6639. Used  returns the currently used object number.  This is useful for routines
  6640. which  need to operate on the currently used object,  also interrupts should
  6641. restore currently used object settings.
  6642.  
  6643. Addr Objectname(Object#)
  6644.  
  6645. Addr  is  a low-level function allowing advanced programmers the ability  to
  6646. find where a particular Blitz object resides in RAM.  An appendix at the end
  6647. of this manual lists all Blitz object formats.
  6648.  
  6649. Maximum Objectname
  6650.  
  6651. The  Maximum  function allows a program to determine the  'maximum'  setting
  6652. for a particular Blitz object. Maximum settings are entered into the
  6653.  
  6654. Page 123
  6655.  
  6656. OPTIONS  retiuester,  accessed throu5:h the 'COMPILER'  menu  of  the  Blitz
  6657. eciitor.
  6658.  
  6659. Page 124
  6660.  
  6661. R-7: ASSEMBLER DIRECTIVES
  6662.  
  6663. A  powerful  feature of Blitz is it's huilt in assctmbitr  This  allows  the
  6664. programmer  to  include machine code in their progams Thosc fatililiat  with
  6665. 6X()()()   assembler.` ul find the ability to mix easy to cotle  BASIC  with
  6666. their own lightning fast machine code routines a powertul concoction.
  6667.  
  6668. Thete arc three ways of including assembler in Blitz prograns.
  6669.  
  6670. Inline:  using PutRrg and GetReg BASIC variables can be exchanged  with  the
  6671. 68000's data and address registers.
  6672.  
  6673. Proceclures:   Statements   and   Functions   can  contain  100%  assembler,
  6674. parameters are passed in registers d()..d5 and in the case of Functions  the
  6675. value  in  D0 is returned to the caller.  The AsmlExit commmand is  used  in
  6676. place of StatmentReturn or FunctionReturn.
  6677.  
  6678. Libraries  Actual commands can he added to Blitz using assembler.   see  the
  6679. libsdev archive in the blitzlibs: volume fot more information.
  6680.  
  6681. Please  note  that when using assmbler inline and within procedures  address
  6682. registers A4-A6 must he preserved.  Blitz uses A5 as a glohal variable base.
  6683. A4  as  a local variable base,  and tries to keep A6 from having to  be  be-
  6684. loaded too often.
  6685.  
  6686. Also  note  that Absolute Short addeessing mode and Short Branches  are  not
  6687. suppotted.
  6688.  
  6689. DCB [.Size] Repeats,Data
  6690.  
  6691. DCB  stantd  for  'define  cotistant block' .DCB  allows  you  to  insert  a
  6692. repeating series of the satire value into your assemblet programs.
  6693.  
  6694. EVEN
  6695.  
  6696. EVEN allows you to word align B1itz's internal program counter.  This may be
  6697. necessary if a DC,  DCB or DS statement has caused the program counter to be
  6698. left at an odd adtitess.
  6699.  
  6700. GetReg 68000 Reg,Expression
  6701.  
  6702. GetReg allows you to tranfer the result of a BASIC expressition to  a  68000
  6703. register.  The result of the expression will first be converted into a  long
  6704. value  before being moved to the data register.  GetReg should only he  used
  6705. to transfer expressions to one of the 8 data registers (d0-d7).  GetReg will
  6706. use the stack to temporarily store any registers used in calculation of  the
  6707. expression.
  6708.  
  6709. PutReg 68000 Reg, Variable
  6710.  
  6711. PutReg may he used to transfer a vlue from any 68000 register (d0-d7/a0-a7)
  6712.  
  6713. Page 125
  6714.  
  6715. into a BASIC variable.  If the specified variable is a string,  long,  float
  6716. or  quick,  then all 4 bytes from the register will be transferred.  If  the
  6717. specified  variable is a word or a byte,  then only the relevant  low  bytes
  6718. will be transferred.
  6719.  
  6720. SysJsr Boutine
  6721.  
  6722. SysJsr  allows  you  to call any of Blitz's system routines  from  your  own
  6723. program. Routine specifies a routine number to call.
  6724.  
  6725. TokeJsr Token[,Form]
  6726.  
  6727. TokeJsr  allows  you to call any of Blitz's library based  routines.   Token
  6728. refers to either a token number,  or an actual token name.  Form refers to a
  6729. particular form of the token.  A full list of all token numbers  with  their
  6730. various forms will be available shortly trom Acid Software.
  6731.  
  6732. ALibJsr Token[,Form]
  6733.  
  6734. ALibJsr  is only used when writing Blitz libraries.  ALibJsr allows  you  to
  6735. call  a  routine from another library from within your own library.   Please
  6736. refer  to  the  Library Writing section of the programmers  guide  for  more
  6737. information on library writing.
  6738.  
  6739. BLibJsr Token[,Form]
  6740.  
  6741. BLibJsr  is only used when writing Blitz libraries.  BLibJsr allows  you  to
  6742. call  a  routine from another library from within your own library.   Please
  6743. refer  to  the  Library Writing section of the programmers  guide  for  more
  6744. information on library writing.
  6745.  
  6746. AsmExit
  6747.  
  6748. AsmExit  is used to exit from functions and statements written in assembler.
  6749. Remember  also  that  registers A4-A6 must be  preserved  in  functions  and
  6750. statements written in assembler.
  6751.  
  6752. Page 126
  6753.  
  6754. R-8: MEMORY CONTROL COMMANDS
  6755.  
  6756. This  section deals with low-level commands which allow you  access  to  the
  6757. Amiga's memory.  Care must be taken when accessing memory in this way or  an
  6758. invitation to the alert guru may be mistakenly made.
  6759.  
  6760. Poke [.Type] Address,Data
  6761.  
  6762. The  Poke  command  will place the specified Data into the  absolute  memory
  6763. location specified by Address.  The size of the Poke may be specified by the
  6764. optional Type parameter.  For example, to poke a byte into memory, you would
  6765. use Poke.b;  to poke a word into memory you would use Poke.w;  and to poke a
  6766. long word into memory you would use Poke.l
  6767.  
  6768. In  addition,  strings may be poked into memory by use of Poke$.  This  will
  6769. cause the ascii code of all characters in the string specified by Data to be
  6770. poked,  byte by byte,  into consecutive memory locations. An extra 0 is also
  6771. poked past the end of the string.
  6772.  
  6773. Peek [. Type](Address)
  6774.  
  6775. The  Peek  function  returns the contents of the  absolute  memory  location
  6776. specified  by  Address.   The  optional Type  parameter  allows  peeking  of
  6777. different sizes.  For example, to peek a byte, you would use Peek.b; to peek
  6778. a word, you would use Peek.w; and to peek a long, you would use Peek.l
  6779.  
  6780. It is also possible to peek a string using Peek$.  This will return a string
  6781. of  characters read trom consecutive memory locations until a byte of  0  is
  6782. found.
  6783.  
  6784. Peeks$ (Address,length)
  6785.  
  6786. Peeks$ will return a string of characters corresponding to bytes peeked from
  6787. consective  memory locations starting at Address,  and Length characters  in
  6788. length.
  6789.  
  6790. Call Address
  6791.  
  6792. Call  will  cause  program flow to be transferred  to  the  absolute  memory
  6793. location specified by Address.
  6794.  
  6795. PLEASE  NOTE!  Call is for advanced programmers only,  as incorrect  use  of
  6796. Call can lead to severe problems - GURUS etc!
  6797.  
  6798. A  68000 JSR instruction is used to transfer program flow,  so an RTS may be
  6799. used to transfer back to the Blitz program.
  6800.  
  6801. Please  refer to the 'Assembler' section of the manual for the rules machine
  6802. code programs must follow to operate correctly within the Blitz environment.
  6803. Page 127
  6804.  
  6805. Bank (Bank#)
  6806.  
  6807. Returns  the meniory location of the given memory Bank,  replaces the  older
  6808. and more stupidly named BankLoc command.
  6809.  
  6810. BankSize (Bank#)
  6811.  
  6812. BankSize  returns the size of the memory hlock allocated for  the  specified
  6813. Bank#.
  6814.  
  6815. lnitBank  Bank#,size,memtype  InitBank  allocates  a  hlock  ot  memory  and
  6816. assigns  it  to the Bank specified.  The memtype is the same  as  the  Amiga
  6817. operating system men1ory flags: l = public 2 = chip 65536 = clear memory
  6818.  
  6819. FreeBank Bank#
  6820.  
  6821. FreeBank de-allocates any memory block allocated tor the Bank specified.
  6822.  
  6823. LoadBank Bank#,FileName$[,MemType]
  6824.  
  6825. The LoadBank command has been modified,  instead of having to initialise the
  6826. bank  before loading a file,  LoadBank will now initialise the bank  to  the
  6827. size  of  the  file  if  it  is not already large enough  or  has  not  been
  6828. initialised at all.
  6829.  
  6830. SaveBank Bank#,filename$
  6831.  
  6832. SaveBank  will  save  the  memory assigned  to  the  Bank  to  the  filename
  6833. specified.
  6834.  
  6835. AllocMem (size,type)
  6836.  
  6837. Unlike  calling  Exec's AllocMem_ command directly Blitz will  automatically
  6838. free any allocated memory when the program ends.  Programmers are advised to
  6839. use  the  InitBank  command.  Flags that can be used with  the  memory  type
  6840. parameter are:  l=public ;fast if present 2=chipmem 65536=clear ;clears  all
  6841. memory allocated with O's
  6842.  
  6843. FreeMem location,size
  6844.  
  6845. Used to tree any memory allocated with the AllocMem command.
  6846.  
  6847. Page 128
  6848.  
  6849. R-9: PROGRAM STARTUP COMMANDS
  6850.  
  6851. This  section covers all commands dealing with how an executable  file  goes
  6852. about starting up.  This includes the ability to allow your programs to  run
  6853. from Workbench, and to pick up parameters supplied through the CLI.
  6854.  
  6855. WBStartup
  6856.  
  6857. By executing WBStartup at some point in your program,  your program will  be
  6858. given the ability to run from Workbench.  A program run from Workbench which
  6859. does NOT include the WBStartup command will promptly crash if an attempt  is
  6860. made to run it from Workbench.
  6861.  
  6862. - NumPars
  6863.  
  6864. The  NumPars  function  allows an executable  file  to  determine  how  many
  6865. parameters  were  passed to it by either Workbench or the  CLI.   Parameters
  6866. passed  from  the CLI are typed following the program name and separated  by
  6867. spaces.
  6868.  
  6869. For example. Iet's say you have created an executable program called myprog,
  6870. and run it trom the CLI in the following way:
  6871.  
  6872. myprog filer Olle2
  6873.  
  6874. In  this  case,  NumPars would return the value '2' - 'file I ' and  'file2'
  6875. beng the 2 parameters.
  6876.  
  6877. Programs  run  from  Workbench are only capable of picking  up  I  parameter
  6878. through the use of either the parameter file's 'Default Tool' entry in  it's
  6879. '.info' file, or by use of multiple selection through the 'Shift' key.
  6880.  
  6881. If no parameters are supplied to an executable file,  NumPars will return 0.
  6882. During program development,  the 'CLI Arguement' menu item in the 'COMPILER'
  6883. menu allows you to test out CLI parameters.
  6884.  
  6885. Par$ (Parameter)
  6886.  
  6887. Par$ return a striny equivalent to a parameter passed to an executable  file
  6888. through  either  the CLI or Workbench.  Please refer  to  NumPars  for  more
  6889. information on parameter passiny.
  6890.  
  6891. CloseEd
  6892.  
  6893. The  CloseEd  statetnent will cause the Blitz editor screen to 'close  down'
  6894. when  programs  are executed from within Blitz.  This  may  be  useful  when
  6895. writing  programs which use a large amount of chip memory,   as  the  editor
  6896. screen itself occupies about 40K of chip memory.
  6897.  
  6898. CloseEd  will have no effect on executable files run outside  of  the  Blitz
  6899. environment.
  6900.  
  6901. NoCli
  6902.  
  6903. NoCli  will prevent the nonnal 'Default Cli' from opening when programs  are
  6904. executed  from  within Blitz.  NoCli has no effect on executable  files  run
  6905. outside of the Blitz environment.
  6906.  
  6907. Page 129
  6908.  
  6909. FromCLI
  6910.  
  6911. Returns TRUE (-1)  if your program was run from the CLI, or FALSE (O) if run
  6912. from the WorkBench.
  6913.  
  6914. ParPath$ (parameter,type)
  6915.  
  6916. ParPath$  returns the path that the parameter resides in,  'type'  specifies
  6917. how you want the path returned:
  6918.  
  6919. 0  You  want only the directory of the parameter returned.  1    You  want  the
  6920. directory along with the parameter name returned.
  6921.  
  6922. If you passed the parameter "FRED" to your program from WorkBench,  and FRED
  6923. resides  in  the  directory   "work:mystuff/myprograms"  then  ParPath$(0,0)
  6924. willreturn  "work:mystuff/myprograms",    but   ParPath$(0,1)   will  return
  6925. "work:mystuff/myprograms/FRED".
  6926.  
  6927. The  way WB handles argument passing of directories is different to that  of
  6928. files.   When a directory is passed as an argument,  ArgsLib gets  an  empty
  6929. string for the name,  and the directory string holds the path to the  passed
  6930. directory AND the directory name itself.
  6931.  
  6932. Page 130
  6933.  
  6934. R-10: SLICE COMMANDS
  6935.  
  6936. Slices  are  Blitz  objects which are the heart  of  Blitz  mode's  powerful
  6937. graphics  system.   Through the use of slices,   many  weird  and  wonderful
  6938. graphical effects can be achieved,  effects not normally possible  in  Amiga
  6939. mode.   This  includes  such  things  as dual  playfield  displays,   smooth
  6940. scrolling, double buffering and more.
  6941.  
  6942. A  slice  may  be  thought of as a 'description'  of  the  appearance  of  a
  6943. rectangular area of the Amiga's display.  This description includes  display
  6944. mode,  colour palette,  sprite and bitplane information. More than one slice
  6945. may be set up at a time,  allowing different areas of the display to take on
  6946. different properties.
  6947.  
  6948. Slices  must  not  overlap in any way (at least two Scan lines  is  required
  6949. between each slice). They may not be positioned side by side.
  6950.  
  6951. Slice  Slice#,Y,Flags  Slice#,   Y,    Width,Height,Flags,BitPlanes,Sprites,
  6952. Colours, w1, w2
  6953.  
  6954. The  Slice  command  is  used to create a Blitz slice  object.   Slices  are
  6955. primarily  of  use in Blitz mode,  allowing you to create highly  customized
  6956. displays.
  6957.  
  6958. In  both forms of the Slice command,  the Y parameter specifies the vertical
  6959. pixel  position  of  the top of the slice.  A Y value of  44  will  position
  6960. slices at about the top of the display.
  6961.  
  6962. In  the  first  torm of the Slice command,  Flags refers to  the  number  of
  6963. bitplanes  in any bitmaps (the bitmap's depth)  to be shown  in  the  slice.
  6964. This form of the Slice command will normally create a lo-res slice,  however
  6965. this  may  be  changed  to  a  hi-res slice by adding  eight  to  the  Flags
  6966. parameter.  For instance,  a Flags value of tour will set up  a  lo-res,   4
  6967. bitplane (16 colour)  slice,  whereas a Flags value of ten will set up a hi-
  6968. res,  2 bitplane (4 colour)  slice.  The width of a slice set up in this way
  6969. will  be  320 pixels for a lo-res slice,  or 640 pixels for a hi-res  slice.
  6970. The  height  of a slice set up using this syntax will be 200  pixels  on  an
  6971. NTSC Amiga, or 256 pixels on a PAL Amiga.
  6972.  
  6973. The second form of the Slice command is far more versatile,  albeit a little
  6974. more  complex.  Width and Height allow you to use specific  values  for  the
  6975. slice's dimensions. These parameters are specified in pixel amounts.
  6976.  
  6977. BitPlanes  refers to the depth of any bitmaps you will be  showing  in  this
  6978. slice.
  6979.  
  6980. Sprites  refers  to  how many sprite channels should be  available  in  this
  6981. slice.  Each slice may have up to eight sprite channels,  allow, ing sprites
  6982. to  be 'multiplexed'.  This is one way to overcome the Amiga's 'eight sprite
  6983. limit'.  It is recommended that the top-most slice be created with all eight
  6984. sprite  channels,   as  this will prevent sprite flicker  caused  by  unused
  6985. sprites.
  6986.  
  6987. Colours  refers to how many colour palette entries should be  available  for
  6988. this slice, and should not be greater than 32.
  6989.  
  6990. Widthl and Width2 specify the width,  in pixels,  of any bitmaps to be shown
  6991. in  this  slice.  If a slice is set up to be a dual-playfield slice,  Widthl
  6992. refers  to the width of the 'foreground' bitmap,  and Width2 refers  to  the
  6993. width  of the 'background' bitmap.  If a slice is NOT set up to be  a  dual-
  6994. playfield  slice,  both Width I and Width2 should be set to the same  value.
  6995. These  parameters allow you to show bitmaps which are wider than the  slice,
  6996. introducing the ability to smooth scroll through large bitmaps.
  6997.  
  6998. Page 131
  6999.  
  7000. The  Flags  parameter has been lett to last because it is the most  complex.
  7001. Flags  allows  you control over many aspects of the slices appearance,   and
  7002. just what ettect the slice has. Here are some example settings for Flags:
  7003.  
  7004.     Fiags    Effect                                    Max BitPlanes
  7005.  
  7006.     $ftf8A    Standard lo-res slice                        6
  7007.     $fft9A    Standard hi-res slice                        4
  7008.     $fitaA    Lo- res, dual -pl ayfield slice                6
  7009.     $tfibA    Hi-res, dual-playfiled slice                4
  7010.     $fffcA    HAM slice                                    6
  7011.  
  7012. WARNING - the next bit is definitely for the more advanced users out  there!
  7013. Knowledge of the following is NOT necessary to make good use of slices.
  7014.  
  7015. Flags  is  actually  a  collection of individual bit-flags.   The  bit-flags
  7016. control how the slices 'copper list' is created Here is a list of  the  bits
  7017. numbers and their ettect:
  7018.  
  7019.     Bit#    Effect
  7020.     15    Create copper MOVE BPLCON0
  7021.     14    Create copper MOVE BPLCONI
  7022.     13    Create copper MOVE BPLCON2
  7023.     12    Create copper MOVE DIWSTRT and MOVE DIWSTOP
  7024.     I0    Create copper MOVE DDFSTRT and MOVE DDFSTOP
  7025.     8    Create copper MOVE BPL I MOD
  7026.     7    Create copper MOVE BPL2MOD
  7027.     4    Create a 2 line 'blank' above top of slice
  7028.     3    Allow for smooth horizontal scrolling
  7029.     2    HAM slice
  7030.     I    Dual-playtield slice
  7031.     0    Hi-res slice - default is lo-res
  7032.  
  7033. Clever  selection of these bits allows you to create 'minimal' slices  which
  7034. may only attect specific system registers.
  7035.  
  7036. The  BitPlanes parameter may also be modified to specify 'odd only' or 'even
  7037. only' bitplanes.  This is of use when using dual playfield displays,  as  it
  7038. allowing  you  to  create a mid display slice which  may  show  a  different
  7039. foreground  or  background  bitmap leaving the  other  intact.   To  specify
  7040. creation  of foreground bitplanes only,  simply set bit 15 of the  BitPlanes
  7041. parameter.  To specify creation of background bitplanes only,  set bit 14 of
  7042. the BitPlanes parameter
  7043.  
  7044. Use Slice Slice#
  7045.  
  7046. Use  Slice  is used to set the specified slice object as being the currently
  7047. used slice.  This is required tor commands such as Show,  ShowF,  ShowB  and
  7048. Blitz mode RGB.
  7049.  
  7050. Page 132
  7051.  
  7052.  
  7053. FreeSlices
  7054.  
  7055. FreeSlices is used to completely free all slices currently in use.  As there
  7056. is no capability to Free individual slices,  this is the only means by which
  7057. slices may be deleted.
  7058.  
  7059. Show Bitmap#[,X, Y]
  7060.  
  7061. Show  is  used to display a bitmap in the currently used slice.  This  slice
  7062. should not be a dual-playfield type slice.  Optional X and Y parameters  may
  7063. be used to position the bitmap at a point other than it's top-left.  This is
  7064. normally  only  of use in cases where a bitmap larger than the  slice  width
  7065. and/or height has been set up.
  7066.  
  7067. ShowF BitMap#[,X, Y[,ShowB X]]
  7068.  
  7069. ShowF  is  used to display a bitmap in the foreground of the currently  used
  7070. slice.   The  slice  must  have  been created  with  the  appropriate  Flags
  7071. parameter in order to support dual-playfield display.
  7072.  
  7073. Optional X and Y parameters may be used to show the bitmap at a point  other
  7074. than  it's  top-left.   Omitting the X and  Y  parameters  is  identical  to
  7075. supplying X and Y values of ().
  7076.  
  7077. The optional ShowB x parameter is only of use in special situations where  a
  7078. dual-playfield  slice has been created to display ONLY a foreground  bitmap.
  7079. In this case,  the X offset of the background bitmap should be specified  in
  7080. the ShowB x parameter.
  7081.  
  7082. ShowB BitMap#[,X,Y[,ShowFX]]
  7083.  
  7084. ShowB  is  used to display a bitmap in the background of the currently  used
  7085. slice.   The  slice  must  have  been created  with  the  appropriate  Flags
  7086. parameter in order to support dual-playfield display.
  7087.  
  7088. Optional X and Y parameters may be used to show the bitmap at a point  other
  7089. than  it's  top-lett.   Omitting the X and  Y  parameters  is  identical  to
  7090. supplying X and Y values of 0.
  7091.  
  7092. The optional ShowF x parameter is only of use in special situations where  a
  7093. dual-playfield  slice has been created to display ONLY a background  bitmap.
  7094. In this case,  the X offset of the foreground bitmap should be specified  in
  7095. the ShowF x parameter.
  7096.  
  7097. ColSplit ColourRegister,Red,Green,Blue,Y
  7098.  
  7099. ColSplit  allows  you  to change any of the palette colour  registers  at  a
  7100. position  relative to the top of the currently used slice.  This allows  you
  7101. to  're-use'  colour registers at different positions  down  the  screen  to
  7102. display different colours.  Y specifies a vertical offset fi-om the  top  of
  7103. the currently used slice.
  7104.  
  7105. CustomCop Copin$, Y
  7106.  
  7107. CustomCop  allows  advanced  programmers   to  introduce  their  own  copper
  7108. instructions at a specified position down the display.  Copins$ refers to  a
  7109. string  of  characters  equivalent to a series of  copper  instructions.   Y
  7110. refers to a
  7111.  
  7112. Page 133
  7113.  
  7114. position down the display.
  7115.  
  7116. ShowBlitz
  7117.  
  7118. ShowBlitz redisplays the entire set up of slices.  This may be necessary  if
  7119. you have made a quick trip into Amiga mode, and wish to return to Blitz mode
  7120. with previously created slices intact.
  7121.  
  7122. CopLoc
  7123.  
  7124. CopLoc returns the memory address of the Blitz mode copper list. All Slices,
  7125. ColSplits, and CustomCops executed are merged into a single copper list, the
  7126. address of which may found using the CopLoc function.
  7127.  
  7128. CopLen
  7129.  
  7130. CopLen  returns the length,  in bytes,  of the Blitz mode copper list.   All
  7131. Slices,  ColSplits,  and CustomCops executed are merged into a single copper
  7132. list, the length of which may found using the CopLen function.
  7133.  
  7134. Display On| Off
  7135.  
  7136. Display is a blitz mode only command which allows you to 'turn on' or  'turn
  7137. off'  the  entire display.  If the display is turned off,  the display  will
  7138. appear as a solid block of colour 0.
  7139.  
  7140. SetBPLCON0 Default
  7141.  
  7142. The  SetBPLCON0 command has been added for advanced control of Slice display
  7143. modes.   The  BPLCON0  hardware register is on page A4-l  of  the  reference
  7144. manual (appendix 4). The bits of interest are as follows:
  7145.  
  7146. bit#l  ERSY external sync (for genlock enabling)  bit#2 LACE interlace  mode
  7147. bit#3 LPEN light pen enable
  7148.  
  7149. Page 134
  7150.  
  7151. R-11: DISPLAY LIBRARY COMMANDS
  7152.  
  7153. The new display library is an alternative to the slice library.  Instead  of
  7154. extending  the  slice  library  for AGA support  a  completely  new  display
  7155. library has been developed.
  7156.  
  7157. Besides  support for extended sprites,  super hires scrolling and 8 bitplane
  7158. displays  a  more  modular method of creating displays has been  implemented
  7159. with  the  use of CopLists.  CopLists need only be initialised once  at  the
  7160. start of the program.  Displays can then be created using any combination of
  7161. CopLists.  Most importantly the CreateDisplay command does not allocate  any
  7162. memory avoiding any memory fragmenting problems.  The new display library is
  7163. for non-AGA displays also.
  7164.  
  7165. To  create  displays the InitCopList command is used to allocate memory  for
  7166. what were up till now known as Slices.  A display is then created by linking
  7167. one or more of these coplists together into a single display.
  7168.  
  7169. With  many  of  the new AGA modes sprite DMA has been screwed  up  something
  7170. severe.   Those wanting to use 8 bitplanes and 8 sprites in  lores  will  be
  7171. disapointed to hear that their displays must be modified to some 256  pixels
  7172. across.
  7173.  
  7174. The  way the Amiga fetches data for each scanline is also a little different
  7175. with the AGA machines.  The effect is that displays have to be created  more
  7176. to the right than usual so the system has time to fetch sprites.
  7177.  
  7178. InitCopList CopList#,ypos,height,type,sprites,colors,customs
  7179.  
  7180. InitCopList  is  used  to  create a CopList for use with  the  CreateDisplay
  7181. command.
  7182.  
  7183. The ypos and height parameters define the vertical section of the screen the
  7184. display will take up.
  7185.  
  7186. Sprites, Colors and Customs will allocate instructions for that many sprites
  7187. (always=8!)  colors (yes,  as many as 256!)  and custom copper  instructions
  7188. (which need to be allocated to take advantage of the custom commands  listed
  7189. at the end of this section).
  7190.  
  7191. A  shortened  version  of the InitCopList command is available  that  simply
  7192. requires  the CopList# and the Type.  From the Type it fills in the  missing
  7193. parameters.
  7194.  
  7195. As  with  slices several lines must be left between coplists when displaying
  7196. more than one.
  7197.  
  7198. Page 135
  7199.  
  7200. The  following  constants make up the type patameter,   add  the  number  of
  7201. bitplanes to the total to make up the type parameter:
  7202.  
  7203.     Type                                        Value
  7204.  
  7205.     #smoothscroll                                 $10
  7206.     #dualplayfield                                $20
  7207.     #extrahalibrite                                $40
  7208.     #ham                                        $8O
  7209.     #lores                                        $000
  7210.     #hires                                        $100
  7211.     #super                                        $200
  7212.     #loressprites                                $400
  7213.     #hiressprites                                $800
  7214.     #supersprites                                $cO0
  7215.     #fmode0                                     $0000
  7216.     #fmode1                                     $1000
  7217.     #fmode2                                        $2000
  7218.     #fmode3                                        $3000
  7219.     #agapalette                                    $10000
  7220.  
  7221. Fot  displays  on  non-AGA  machines only #fmode()   and  #loressprites  are
  7222. allowed More docu'1lentation,  examples and fixes will be published soon for
  7223. creating displays
  7224.  
  7225. CreateDisplay CopList#[,CopList#..]
  7226.  
  7227. CreateDisplay  is used to setup a new screen display with  the  new  display
  7228. library  Any number of CopLists can be passed to CreateDisplay  although  at
  7229. present  they  must  be  in  order  of vertical  position  and  not  overlap
  7230. CreateDisplay  then  links the Copl.ists together using  internal  pointers.
  7231. bitmaps, colours and sprites attached to coplists are not affected
  7232.  
  7233. DisplayBitMap CopLis t#, bmap[,x, y] [, bmap[,x, y]]
  7234.  
  7235. The  DisplayBitMap command is similar in usage to the slice libraries'  show
  7236. commands  Instead  of different commands for front and back  playfields  and
  7237. smooth  scroll  options  there is only the one  DisplayBitMap  command  with
  7238. various parameter options With AGA machines,  the x positioning of lores and
  7239. hires  coplists uses the fractional part of the x parameter for super smooth
  7240. scrolling  The  CopList must be initialised with the smooth  scrolling  flag
  7241. set if the x,y parameters are used, same goes tor dualplayfield.
  7242.  
  7243. DisplaySprite CopList#,Sprite#,X, Y,Sprite Channel
  7244.  
  7245. DisplaySprite  is sitnilar to the slice libraries ShowSprite  cotnmand  with
  7246. the  added  advantage  of  super hires positioning  and  extra  wide  sprite
  7247. handling. See also SpriteMode and the Usage discussion above.
  7248.  
  7249. DisplayPalette CopList#,Palette# [, coloroffset]
  7250.  
  7251. DisplayPalette copies colour information frotn a Palette to the CopList
  7252. specified.
  7253.  
  7254. Page 136
  7255.  
  7256.  
  7257. DisplayControls CopList#, BPL CON2, BPLCON3, BPL CON4
  7258.  
  7259. DisplayControls allows access to the more remote options  available  in  the
  7260. Amiga's display system. The following are the most important bits from these
  7261. registers (still unpublished by Commodore!*()@GYU&^)
  7262.  
  7263. The  default  values are given at the top of the table,  the parameters  are
  7264. exclusive or'd with these values.
  7265.  
  7266. To  set all the sprite color offsets to I so that sprite colours are fetched
  7267. from  color  registers  24()..255   instead  of  16..31  we  would  use  the
  7268. parameters: DisplayControls 0,0,0,$ee
  7269.  
  7270. Bit#        BPLCON2            BPLCON3                            BPLCON4
  7271.             ($224)            ($c00)                            ($11)
  7272. 15            *            BANK2 *activecolorbank            BPLAM7 ;xorithbitplane            
  7273. 14            ZDBPSEL2        BANK1 *                            BPLAM6 ;DMA altering
  7274. 13            ZDBPSEL1        BANK0 *                            BPLAM5 ;effectivecolour
  7275. 12            ZDBPSEL0        PF20F2 coloffset pfield 2        BPLAM4 ;look up
  7276. 11            ZDBPEN            PF20F1                            BPLAM3
  7277. 10            ZDCTEN            PF20F0                            BPLAM2
  7278. 09            KILLEHB *        LOCT *palette hi/lo nibble        BPLAM1
  7279. 08            RDRAM=0 *                                        BPLAM0
  7280. 07            SOGEN            SPRESI *sprite res                ESPRM7 high order color
  7281. 06            PF2PRI H        SPRES0 *                        ESPRM6 offset tor even
  7282. 05            PF2P2            BRDRBLANK border                ESPRM5 sprites
  7283. 04            PF2P1            BRDNTRAN zd=border                ESPRM4
  7284. 03            PFIP0                                            OSPRM7 hiorder color
  7285. 02            PFIP2            ZDCLCKEN zd= 14mhz                OSPRM6 offset for odd
  7286. 01            PFIPI            BRDSPRT spritesinborders!        OSPRM5 sprites
  7287. 00            PFIPO            EXTBLKEN blank output?            OSPRM4
  7288.  
  7289.  
  7290. ! = Don't touch
  7291. H -See standard hardware reference manual
  7292. * - controlled by display library
  7293. ZD - any reference to ZD is only a guess (just sold my genlock)
  7294.  
  7295. DisplayAdjust CopList#,fetchwid,dUfstrt,dUfstop,diwstrt,diwstop
  7296.  
  7297. Temporary control of display registers until I get the widthadjust parameter
  7298. working  with  InitCopL.ist.  Currently only  standard  width  displays  are
  7299. available but you can modify the width manually (just stick a screwdriver in
  7300. the  back of your 1084)  or with some knowledge of Commodores AGA circuitry.
  7301. Ha  ha  ha.   No  to be quite serious I really do not have a clue  how  they
  7302. cludeged  up  the  Amiga  chip set.  When ECS was  introduced  suddenly  all
  7303. display fetching moved to the right.  Now they seem to have done the same to
  7304. sprites  so  it  is near impossible to have them all going without  limiting
  7305. yourself to a seriously thin display.
  7306.  
  7307. If  you  hack  around with the system copperlists you'll find they  actually
  7308. change fetch modes as you scroll a viewport across the display and
  7309.  
  7310. Page 137
  7311.  
  7312. commodore say you should not use sprites anyway so as to be compatible  with
  7313. their new hardware which is rumoured to run WindowsNT,  yipeee.  By then  we
  7314. will  be  hopefully  shipping the Jaguarlib  for  Blitz.   (close  than  you
  7315. think)...
  7316.  
  7317. CustomColors CopList#, CCOffset, YPos,Palette,startcol,numcols
  7318.  
  7319. Using  the  custom copper space in a display,  CustomColors will  alter  the
  7320. displays  palette at the given YPos.  The number of customcops  required  is
  7321. either 2+numcols for ecs displays and 2+n+n+n/16 for age displays.  In  age,
  7322. numcols must be a multiple of 32.
  7323.  
  7324. Note that large AGA palette changes may take several lines of the display to
  7325. be complete.
  7326.  
  7327. CustomStri ng CopList#, CCOffset, YPos, Copper$
  7328.  
  7329. CustomString allows the user to insert their own copper commands  (contained
  7330. in  a  string)  into the display's copper list at a given vertical position.
  7331. The  atnount of space required is equal to the number of copper instructions
  7332. in  the Copper$ (length of string divide by 4)  plus 2 which of course  have
  7333. to be allocated with InitCopList before CustomString is used.
  7334.  
  7335. CustomSprites Coplist#, CCOffset, YPos, NumSprites
  7336.  
  7337. CustomSprites inserts a copper list that reinitialises the sprites  hardware
  7338. at  a  certain  vertical position in the display.  These lower  sprites  are
  7339. assigned sprite numbers of 8..15. CustomCops required = 4 x numsprites + 2
  7340.  
  7341. DisplayDblScan mode
  7342.  
  7343. DisplayDblScan is used to divide the vertical resolution of the  display  by
  7344. 2,4,8  or  16 using Modes 1,2,3 and 4.  This is most useful for fast  bitmap
  7345. based zooms. A Mode of 0 will return the display to 100% magnification.
  7346.  
  7347. As  with  the  DisplayRainbow,  DisplayRGB,  DisplayUser  and  DisplayScroll
  7348. commands  DisplayDblScan uses the new line by line  copper  control  of  the
  7349. display library. To initialise this mode a negative parameter is used in the
  7350. CustotnCops parameter of the InitCopList command.  DisplayDblScan requires 2
  7351. copper instructions per line (make CustomCops=-2).
  7352.  
  7353. DisplayRai nbow CopList#, Register,Palettetcopoffset]
  7354.  
  7355. DisplayRainbow is used to alter a certain colour register vertically down  a
  7356. display.   It  simple  maps  each colour in a palette  to  the  coresponding
  7357. vertical  position  of  the  display.    ECS  displays  require  one  copper
  7358. instruction per line while AGA displays require 4.
  7359.  
  7360. DisplayRGB CopList#,Pegister,line,r,g,bGcopoffset]
  7361.  
  7362. DisplayRGB  is  a  single  line  version   of  DisplayRainbow  allowing  the
  7363. programmer  to  alter  any  register   of  any  particular  line.   As  with
  7364. DisplayRainbow ECS displays require I copper instruction while AGA  requires
  7365. 4.
  7366.  
  7367. Page 138
  7368.  
  7369. DisplayUser CopList#, Line,Stringt Offset]
  7370.  
  7371. DisplayUser allows the programmer to use their own Copper$ at  any  line  of
  7372. the  display.  Of course copper instructions have to be allocated  with  the
  7373. number of copper instructions in the InitCoplist multiplied by - 1.
  7374.  
  7375. DisplayScrol l CopList#, &xpos. q(n), &xpos.q(n)[, Offset]
  7376.  
  7377. DisplayScroll allows the program to dynamically display any part of a bitmap
  7378. on  any  line  of  the  display.  DisplayScroll  should  always  follow  the
  7379. DisplayBitMap  command.  The parameters are two arrays  holding  a  list  of
  7380. xoffsets that represent the difference in horizontal position from the  line
  7381. above.   AGA machines are able to use the fractional part of each entry  for
  7382. super  hiresolution positioning of the bitmap.  Three instructions per  line
  7383. are required for the DisplayScroll command.
  7384.  
  7385. Page 139
  7386.  
  7387. R-12: BLITZMODE IO COMMANDS
  7388.  
  7389. This  sections  refers to various Input/Output commands available  in  Blitz
  7390. mode.
  7391.  
  7392. It should be noted that although the Joyx,  Joyy,  Joyr,  and Joyb functions
  7393. do  not  appear  here,  they are still available in  Blitz  mode  (yes  your
  7394. honour).
  7395.  
  7396. BlikKeys Onl Off
  7397.  
  7398. BlitzKeys is used to turn on or off Blitz mode keyboard reading.   If  Blitz
  7399. mode  keyboard reading is enabled,  the Inkey$ function may be used to  gain
  7400. information about keystrokes in Blitz mode.
  7401.  
  7402. BlikQualifier
  7403.  
  7404. BlitzQualifier returns any qualifier keys that were held down in combination
  7405. with the last inkey$ during BlitzMode input.
  7406.  
  7407. BlikRepeat Delay,Speed
  7408.  
  7409. BlitzRepeat  allows  you  to determine key repeat characteristics  in  Blitz
  7410. mode.  Delay specifies the amount of time,  in fiftieths of a second, before
  7411. a  key will start repeating.  Speed specifies the amount of time,  again  in
  7412. fiftieths  of  a  second,  between repeats of a  key  once  it  has  started
  7413. repeating.
  7414.  
  7415. BlitzRepeat  is  only  effective when the Blitz  mode  keyboard  reading  is
  7416. enabled. This is done using the BlitzKeys command.
  7417.  
  7418. RawStatus (Rawkey)
  7419.  
  7420. The  RawStatus  function can be used to determine if an  individual  key  is
  7421. being held down or not.  Rawkey is the rawcode of the key to check for.   If
  7422. the specified key is being held down, a value of -I will be returned. If the
  7423. specified key is not being held down, a value of zero will be returned.
  7424.  
  7425. RawStatus is only available if Blitz mode keyboard reading has been enabled.
  7426. This is done using the BlitzKeys command.
  7427.  
  7428. Mouse On| Off
  7429.  
  7430. The  Mouse  command turns on or off Blitz mode's ability to read the  mouse.
  7431. Once  a  Mouse On has been executed,  programs can read the mouse's position
  7432. or speed in Blitz mode.
  7433.  
  7434. Pointer Sprite#,Sprite Channel
  7435.  
  7436. The  Pointer  command allows you to attach a sprite object  to  the  mouse's
  7437. position in the currently used slice in Blitz mode.
  7438.  
  7439. To properly attach a sprite to the mouse position,  several commands must be
  7440. executed in the correct sequence.  First, a sprite must be created using the
  7441. LoadShape  and  GetaSprite sequence of commands.  Then,   a  slice  must  be
  7442. created to display the sprite in.
  7443.  
  7444. A Mouse On must then be executed to enable mouse reading.
  7445.  
  7446. Page 140
  7447.  
  7448. MouseArea Minx,Miny,Maxx,Maxy
  7449.  
  7450. MouseArea  allows you to limit Blitz mode mouse movement  to  a  rectangular
  7451. section  of  the display.  Minx and Miny define the top left corner  of  the
  7452. area, Maxx and Maxy define the lower right corner.
  7453.  
  7454. MouseArea defaults to an area from 0,0 to 320,200.
  7455.  
  7456. MouseX
  7457.  
  7458. If  Blitz mode mouse reading has been enabled using a Mouse On command,  the
  7459. MouseX function may be used to find the current horizontal location  of  the
  7460. mouse.   If  mouse reading is enabled,  the mouse position will  be  updated
  7461. every  fiftieth of a second,  regardless of whether or not a  mouse  pointer
  7462. sprite is attached.
  7463.  
  7464. MouseY
  7465.  
  7466. If  Blitz mode mouse reading has been enabled using a Mouse On command,  the
  7467. MouseY  function may be used to find the current vertical  location  of  the
  7468. mouse. If mouse reading is enabled, the mouse position will be updated every
  7469. fiftieth of a second, regardless of whether or not a mouse pointer sprite is
  7470. attached.
  7471.  
  7472. MouseXSpeed
  7473.  
  7474. If  Blitz mode mouse reading has been enabled using a Mouse On command,  the
  7475. MouseXSpeed  function may be used to find the current  horizontal  speed  of
  7476. mouse  movement,  regardless of whether or not a sprite is attached  to  the
  7477. mouse.
  7478.  
  7479. If  MouseXSpeed returns a negative value,  then the mouse has been moved  to
  7480. the left.  If a positive value is returned,  the mouse has been moved to the
  7481. right.
  7482.  
  7483. MouseXSpeed  only  has  relevance after every  vertical  blank.   Therefore,
  7484. MouseXSpeed should only be used after a VWait has been executed,  or  during
  7485. a vertical blank interupt.
  7486.  
  7487. MouseYSpeed
  7488.  
  7489. If  Blitz mode mouse reading has been enabled using a Mouse On command,  the
  7490. MouseYSpeed  function  may be used to find the  current  vertical  speed  of
  7491. mouse  movement,  regardless of whether or not a sprite is attached  to  the
  7492. mouse.
  7493.  
  7494. If  MouseYSpeed  returns a negative value,  then the mouse  has  been  moved
  7495. upwards.   If  a  positive  value is returned,  the  mouse  has  been  moved
  7496. downwards.
  7497.  
  7498. MouseYSpeed  only  has  relevance after every  vertical  blank.   Therefore,
  7499. MouseYSpeed should only be used after a VWait has been executed,  or  during
  7500. a vertical blank interupt.
  7501.  
  7502. LoadBlitzFont BlitzFont#,Fontname.font$
  7503.  
  7504. LoadBlitzFont  creates  a  blitzfont object.  Blitzfonts  are  used  in  the
  7505. rendering  of  text to bitmaps.  Normally,  the standard rom resident  topaz
  7506. font is used to render text to
  7507.  
  7508. Page 141
  7509.  
  7510. bitmaps. However, you may use LoaclBlitzFont to select a font of your choice
  7511. for bitmap output.
  7512.  
  7513. The  specified Fontname.font$ parameter specifies the name of  the  tont  to
  7514. load, which MUST be in your FONTS: directory.
  7515.  
  7516. I  oadBlitzFont  may  only  be used to load eight by eight  non-proportional
  7517. fonts.
  7518.  
  7519. Use BlitzFont BlitzFont#
  7520.  
  7521. If  you htLvc loaded two or more blitzfont objects using LoadBlitzFont,  Use
  7522. Blitzl;ont  may  be  used  to select one of these fonts  for  future  bitmap
  7523. output.
  7524.  
  7525. Free BlitzFont BlitzFont#
  7526.  
  7527. Free  BlitzFont 'unlotLds' a previously loaded blitzfont object.  This frees
  7528. up any memory occupied by the font.
  7529.  
  7530. BitMapOutput BitMap#
  7531.  
  7532. BitMapOutput may be used to redirect Print statements to be rendered onto  a
  7533. bitmap.   The  font  used for rendering may be altered using  LoadBlitzFont.
  7534. Fonts used for bitmap output must be eight by eight non-proportional fonts.
  7535.  
  7536. BitMapOutput  is mainly of use in Blitz mode,  as.other forms  of  character
  7537. output become unavailable in Blitz mode.
  7538.  
  7539. Colour Foreground Colour[,Background Colour]
  7540.  
  7541. Colour  allows  you  to  alter the colours use to render  text  to  bitmaps.
  7542. Foreground colour allows you to specify the colour text is rendered in,  and
  7543. the  optional Background colour allows you to specify the colour of the text
  7544. background.
  7545.  
  7546. The palette used to access these colours will depend upon whether you are in
  7547. Blitz  mode  or in Amiga mode.  In Blitz mode,  colours will come  from  the
  7548. palette of the currently used slice.  In Amiga mode,  colours will come from
  7549. the palette of the screen the bitmap is attached to.
  7550.  
  7551. Locate X, Y
  7552.  
  7553. If  you are using BitMapOutput to render text,  Locate allows you to specify
  7554. the cursor position at which characters are rendered.
  7555.  
  7556. X  specifies a character position across the bitmap,  and is always  rounded
  7557. down to a multiple of an eighth.
  7558.  
  7559. Y  specifies a character position down the bitmap,  and may be a  fractional
  7560. value.   For example,  a Y of 1.5 will set a cusor position one and  a  half
  7561. characters down from the top of the bitmap.
  7562.  
  7563. CursX
  7564.  
  7565. When  using BitMapOutput to render text to a bitmap,  CursX may be  used  to
  7566. find  the horizontal character position at which the next character  Printed
  7567. will appear.
  7568.  
  7569. CursX  will reflect the cursor position of the bitmap specified in the  most
  7570. recently executed BitMapOutput statement.
  7571.  
  7572. Page 142
  7573.  
  7574. CursY
  7575.  
  7576. When  using BitMapOutput to render text to a bitmap,  CursY may be  used  to
  7577. find  the  vertical  character position at which the next character  Printed
  7578. wil1 appear.  CursY will reflect the cursor position of the bitmap specified
  7579. in the most recently executed BitMapOutput statement.
  7580.  
  7581. BitMapinput
  7582.  
  7583. BitMaplnput  is a special command designed to allow you  to  use  Edit$  and
  7584. Edit  in  Blitz  mode.  To work properly,  a BlitzKeys  On  must  have  been
  7585. executed  before BitMapInput.  A BitMapOutput must also be  executed  before
  7586. any Edit$ or Edit commands are encountered.
  7587.  
  7588. Page 143
  7589.  
  7590. R-13: BITMAP COMMANDS
  7591.  
  7592. Blitz  BitMap  objects  are  used primarily for  the  purpose  of  rendering
  7593. graphics.   Most  commands in Blitz for generating graphics  (excluding  the
  7594. Window and Sprite commands) depend upon a currently used BitMap.
  7595.  
  7596. BitMap objects may be created in one of two ways. A BitMap may be created by
  7597. using the BitMap command,  or a BitMap may be 'borrowed' from a Screen using
  7598. the ScreensBitMap command.
  7599.  
  7600. BitMaps  have  three main properties.  They have a width,  a  height  and  a
  7601. depth.   If  a  BitMap  is created using the ScreensBitMap  command,   these
  7602. properties  are taken from the dimensions of the Screen.   If  a  BitMap  is
  7603. created using the BitMap command, these properties must be specified.
  7604.  
  7605. BitMap BitMap#, Width,Height,Depth
  7606.  
  7607. BitMap creates and initializes a bitmap object.  Once created, the specified
  7608. bitmap becomes the currently used bitmap.  Width and Height specify the size
  7609. of  the  bitmap.   Depth specifies how many colours may be  drawn  onto  the
  7610. bitmap,   and  may  be  in the range one through six.   The  actual  colours
  7611. available  on  a  bitmap can be calculated using 2^depth.  For  example,   a
  7612. bitmap of depth three allows for 2^3 or eight colours.
  7613.  
  7614. Use BitMap BitMap#
  7615.  
  7616. Use  BitMap defines the specified bitmap object as being the currently  used
  7617. BitMap.   This is necessary for commands,  such as Blit,  which require  the
  7618. presence of a currently used BitMap.
  7619.  
  7620. Free BitMap BitMap#
  7621.  
  7622. Free  BitMap erases all information connected to the specified bitmap.   Any
  7623. memory  occupied by the bitmap is also deallocated.  Once free'd,  a  bitmap
  7624. may no longer be used.
  7625.  
  7626. CopyBitMap BitMap#,BitMap#
  7627.  
  7628. CopyBitMap  will make an exact copy of a bitmap object into  another  bitmap
  7629. object.   The  first BitMap# parameter specifies the source bitmap  for  the
  7630. copy, the second BitMap# the destination.
  7631.  
  7632. Any graphics rendered onto the source bitmap will also be copied.
  7633.  
  7634. ScreensBitMap Screen#,BitMap#
  7635.  
  7636. Blitz  allows  you the option of attaching a bitmap object to any  Intuition
  7637. Screens you open.  If you open a Screen without attaching a bitmap, a bitmap
  7638. will  be  created  anyway.   You  may   then  find  this  bitmap  using  the
  7639. ScreensBitMap command.  Once ScreensBitMap is executed, the specified bitmap
  7640. becomes the currently used bitmap.
  7641.  
  7642. Page 144
  7643.  
  7644. LoadBitMap BitMap#,Filename$[,Palette#]
  7645.  
  7646. LoadBitMap  allows  you  to  load an ILBM  IFF  graphic  into  a  previously
  7647. initialized bitmap object.  You may optionally load in the graphics's colour
  7648. palette  into  a  palette object specified by Palette#.  An  error  will  be
  7649. generated if the specified Filename$ is not in the correct IFF format.
  7650.  
  7651. SaveBitmap BitMap#, Filename$t Palette#]
  7652.  
  7653. SaveBitMap  allows  you to save a bitmap to disk in  ILBM  IFF  format.   An
  7654. optional palette may also be saved with the IFF.
  7655.  
  7656. BitPlanesBitMap SrcBitMap, DestBitMap, PlanePick
  7657.  
  7658. BitPlanesBitMap creates a 'dummy' bitmap from the SrcBitMap  with  only  the
  7659. bitplanes specified by the PlanePick mask. This is useful for shadow effects
  7660. etc.   where  blitting speed can be speed up because of the fewer  bitplanes
  7661. involved
  7662.  
  7663. ShapesBitMap Shape#,BitMap#
  7664.  
  7665. ShapesBitMap  creates  a  dummy  BitMap so  drawing  commands  can  be  used
  7666. directly on a shapes image data.
  7667.  
  7668. CludgeBitMap BitMap#, Width,Height,Depth,Memory
  7669.  
  7670. CludgeBitMap  will  create a bitmap object with  the  proportions  for  that
  7671. specified using the memory location given.  Of course,  the memory  location
  7672. specified  must  be  in  chipmem and it is upto  the  user  to  ensure  that
  7673. sufficient memory has been allocated.  This command is most useful for games
  7674. where memory fragmentation can be a big problem,  by allocating one block of
  7675. memory  on program initialisation for all bitmaps CludgeBitMap can  be  used
  7676. so that creating and freeing of BitMaps is not necessary.
  7677.  
  7678. BitMapWindow srobitmap#,destbitmap#,x,y,w,h
  7679.  
  7680. BitMapWindow creates a dummy bitmap inside another bitmap.   Both  x  and  w
  7681. parameters  are  rounded to the nearest 16 pixel boundary.   Any  rendering,
  7682. printing  and  blitting to the new bitmap will be clipped  inside  the  area
  7683. used.
  7684.  
  7685. BitMapOrigin BitMapOrigin BitMap#,x,y
  7686.  
  7687. BitMapOrigin  allows the programmer to relocate the  origin  (0,0)   of  the
  7688. bitmap used by the drawing commands line, poly, box and circle.
  7689.  
  7690. Decodel LB M DecodelLBM BitMap#,MemoryLocation
  7691.  
  7692. A very fast method of unpacking standard iffilbm data to a bitmap.  Not only
  7693. does  this command allow a faster method of loading standard IFF  files  but
  7694. allows  the  programmer to "incbin" iff pictures in their  programs.See  the
  7695. discussion above for using DecodeILBM on both files and included memory.
  7696.  
  7697. Page 145
  7698.  
  7699. R-14: 2D DRAWING COMMANDS
  7700.  
  7701. This section covers all commands related to rendering arbitrary graphics  to
  7702. bitmaps
  7703.  
  7704. All  commands  perform  clipping - that is,  they  all  allow  you  to  draw
  7705. 'outside' the edge.s of bitmaps without grievous bodily harm being  done  to
  7706. the Amiga's memory
  7707.  
  7708. Cls [Colour]
  7709.  
  7710. Cls  allows you to fill the currently used bitmap with the colour  specified
  7711. by  the  Colour parameter.  If Colour is omitted,  the currently used bitmap
  7712. will  be  filled with colour ().  A Coltiur parameter of - I will cause  the
  7713. entire bitmap to be 'inverted'.
  7714.  
  7715. Plot X, Y,Colour
  7716.  
  7717. Plot  is  used  to alter the colour of an individual pixel on the  currently
  7718. used bitmap.  X and Y .specify the location of the pixel to be altered,  and
  7719. Colour specifies the colour to change the pixel to.  A Colour parameter of -
  7720. I will cause the pixel at the specified pixel position to be 'inverted'.
  7721.  
  7722. Point (X,Y)
  7723.  
  7724. The  Point  function  will return the colour of a particular  pixel  in  the
  7725. currently used hitmap.  The pixel to be examined is specified by the X and Y
  7726. parameters  If X and Y specify a point outside the edges of the  bitmap,   a
  7727. value of - I will be returned.
  7728.  
  7729. Line [X1, Y1,]X2, Y2,Colour
  7730.  
  7731. The  Lhie command draws a line connecting two pixels onto the currently used
  7732. bitmap.  The X and Y parameters specify the pixels to be joined,  and Colour
  7733. specifies the colour to draw the line in If Xl and Yl are omitted,  the  end
  7734. points (X2,Y2) of the last line drawn will be used. A Colour parameter of -I
  7735. will cause an 'inverted' line to be drawn
  7736.  
  7737. Box X1, Y1,X2, Y2, Colour
  7738.  
  7739. The  Box command draws a rectangular outline onto the currently used bitmap.
  7740. X  I,   Y  I,  X2 and Y2 specify two corners of the box to be drawn.  Colour
  7741. refers  to  the colour to draw the box in.  A Colour parameter  of  -I  will
  7742. cause an 'inverted' box to be drawn.
  7743.  
  7744. Boxf X1, Y1,X2, Y2, Colour
  7745.  
  7746. Boxf draws a solid rectangular shape on the currently used bitmap.  Xl,Yl,X2
  7747. and Y2 refer to two corners of the box.  Colour specifies the colour to draw
  7748. the box in.  A Colour parameter of -I will cause the rectangular area to  be
  7749. 'inverted'.
  7750.  
  7751. Circle X, Y,Radius[, Y Radius],Colour
  7752.  
  7753. Circle will draw an open circle onto the currently used bitmap. X and Y
  7754.  
  7755. Page 146
  7756.  
  7757. specify  the  mid point of the circle.  The Radius parameter  specifies  the
  7758. radius of the circle.  If a Y Radius parameter is supplied,  then an ellipse
  7759. may  be drawn.  A Colour parameter of -l will cause an 'inverted' circle  to
  7760. be drawn.
  7761.  
  7762. Circlet X, Y,Radius[, Y Radius],Colour
  7763.  
  7764. Circlef will draw a filled circle onto the currently used bitmap.  X  and  Y
  7765. specify the mid point of the circle - Colour,  the colour in which  to  draw
  7766. the circle.  The Radius parameter specifies the radius of the circle. If a Y
  7767. Radius parameter is supplied, then an ellipse may be drawn.
  7768.  
  7769. A Colour parameter of - l will cause an 'inverted' circle to be drawn.
  7770.  
  7771. Scroll X1, Y1, Width,Height,X2, Y2[,Source BitMap]
  7772.  
  7773. Scroll allows rectangular areas within a bitmap to be moved around.  Xl, Yl,
  7774. Width and Height specify the position and size of the rectangle to be moved.
  7775. X2 and Y2 specify the position the rectangle is to be moved to.
  7776.  
  7777. An  optional  Source BitMap parameter allows you to move  rectangular  areas
  7778. from one bitmap to another.
  7779.  
  7780. FloodFill X, Y, Colour G Border Colour]
  7781.  
  7782. FloodFill  will  'colour  in'  a  region  of  the  screen  starting  at  the
  7783. coordinates X,Y.  The first mode will fill all the region that is  currently
  7784. the  colour at the coordinates X,Y with the colour specified by Colour.  The
  7785. second  mode  will  fill  a region starting at X,Y  and  surrounded  by  the
  7786. BorderColour with Colour.
  7787.  
  7788. FreeFill
  7789.  
  7790. FreeFill will deallocate the memory that Blitz uses to execute the  commands
  7791. Circlef, FloodFill, ReMap and Boxf.
  7792.  
  7793. Blitz uses a single monochrome bitmap the size of the bitmap being drawn  to
  7794. to do it's filled routines, by using the FreeFill command this BitMap can be
  7795. 'freed' up if no more filled commands are to be executed.
  7796.  
  7797. ReMap colour#O,colour#1[,Bitmap]
  7798.  
  7799. ReMap  is used to change all the pixels on a BitMap in one colour to another
  7800. colour.  The optional BitMap parameter will copy all the pixels in  Colour#O
  7801. to their new colour on the new bitmap.
  7802.  
  7803. Poly numpoints, *coords. w,color
  7804.  
  7805. Poly  is  a bitmap based commands such as Box and Line.  It draws a  polygon
  7806. using coordinates from an array or newtype of words.
  7807.  
  7808. Polyf numpoints, *coords. w,color[,color2]
  7809.  
  7810. Same  as  Poly  except  Polyf  draws filled polygons  and  has  an  optional
  7811. parameter  color2,  if used this colour will be used if the coordinates  are
  7812. listed in anti-clockwise order,  useful for 3D type applications. If color2=
  7813. -l  then  the  polygon is not drawn if the verticies  are  listed  in  anti-
  7814. clockwise order.
  7815.  
  7816. Page 147
  7817.  
  7818. R-15: ANIMATION SUPPORT COMMANDS
  7819.  
  7820. The  following  4 commands allow the display of standard IFF  animations  in
  7821. Blitz.   The  animation must be compatible with the DPaint 3  format,   this
  7822. method  uses  long  delta (type 2)  compression and  does  not  include  any
  7823. palette changes.
  7824.  
  7825. Anims  in  nature use a double buffered display,  with the addition  of  the
  7826. ShowBitMap command to Blitz we can now display (play)  Anims in  both  Blitz
  7827. and  Amiga  modes.  An Anim consists of an initial frame which needs  to  be
  7828. displayed (rendered)  using the InitAnim command, subsequent frames are then
  7829. played  by using the NextFrame command.  The Frames()  function returns  the
  7830. number of frames of.an Anim.
  7831.  
  7832. We have also extended the LoadShape command to support Anim brushes.
  7833.  
  7834. LoadAnim Anim#,FileName$[Palette#]
  7835.  
  7836. The  LoadAnim  command  will  create  an  Anim  object  and  load  a  DPaint
  7837. compatible animation.  The ILBMInfo command can be used to find the  correct
  7838. screensize  and  resolution  for  the  anim  file.   The  optional  Palette#
  7839. parameter can be used to load a palette with the anims correct colours.
  7840.  
  7841. InitAnim Anim#l,Bitmap#]
  7842.  
  7843. InitAnim  renders the first two frames of the Anim onto the  current  BitMap
  7844. and  the  BitMap  specified  by the second parameter.   The  second  BitMap#
  7845. parameter is optional,  this is to support Anims that are not in  a  double-
  7846. buffered  format  (each frame is a delta of the  last  frame  not  from  two
  7847. frames  ago).  However,  the two parameter double buffered form of  InitAnim
  7848. should always be used. (hmmm don't ask me O.K.!)
  7849.  
  7850. NextFrame Anim#
  7851.  
  7852. NextFrame  renders the nextframe of an Anim to the current BitMap.   If  the
  7853. last  frame  of an Anim has been rendered NextFrame will loop  back  to  the
  7854. start of the Animation.
  7855.  
  7856. Frames (Anim#)
  7857.  
  7858. The Frames() function returns the number of frames in the specified Anim.
  7859.  
  7860. Page 148
  7861.  
  7862. R-16: SHAPE HANDLING COMMANDS
  7863.  
  7864. Shape  objects  are used for the purpose of storing graphic  images.   These
  7865. images may be used in a variety of ways.  For example,  a shape may be  used
  7866. as the graphics for a gadget,  or as the graphics for a menu item or perhaps
  7867. an alien being bent on your destruction.
  7868.  
  7869. See  the Blitting section for the many commands that are available  for  the
  7870. purpose  of  drawing shapes onto bitmaps.  These commands  use  the  Amiga's
  7871. blister chip to achieve this, and are therefore very fast.
  7872.  
  7873. Note  that Blitz supports two different file formats for storage of  shapes.
  7874. Standard  IFF  brush  files  (such  as created  with  DPaint)   as  well  as
  7875. animbrushes  use  the  LoadShape/SaveShape commands  and  the  faster  Blitz
  7876. format uses the LoadShapes and SaveShapes format.
  7877.  
  7878. LoadShape Shape#,Filename$LPalette#]
  7879.  
  7880. LoadShape  allows  you to load an ILBM IFF file into a  shape  object.   The
  7881. optional  Palette#  parameter  lets you also  load  the  colour  information
  7882. contained in the file into a palette object.
  7883.  
  7884. The LoadShape command has now been extended to support anim brushes,  if the
  7885. file is an anim brush the shapes are loaded into consecutive shapes starting
  7886. with the Shape# provided.
  7887.  
  7888. SaveShape Shape#,Filename$,Palette#
  7889.  
  7890. SaveShape will create an ILBM IFF file based on the specified shape  object.
  7891. If you want the file to contain colour information,  you should also specify
  7892. a palette object using the Palette# parameter.
  7893.  
  7894. LoadShapes Shape#[, Shape#],Filename$
  7895.  
  7896. LoadShapes  lets you load a 'range' of shapes from disk  into  a  series  of
  7897. shape  objects.   The file specified by Filename$ should have  been  created
  7898. using the SaveShapes command.
  7899.  
  7900. The  first  Shape# parameter specifies the number of the first shape  object
  7901. to  be loaded.  Further shapes will be loaded into increasingly higher shape
  7902. objects.
  7903.  
  7904. If  a  second  Shape# parameter is supplied,  then only  shapes  up  to  and
  7905. including the second Shape# value will be loaded.  If there are  not  enough
  7906. shapes  in  the  file  to fill this range,  any excess  shapes  will  remain
  7907. untouched.
  7908.  
  7909. SaveShapes Shape#,Shape#,Filename$
  7910.  
  7911. SaveShapes allows you to create a file containing a range of shape  objects.
  7912. This file may be later loaded using the LoadShapes command.
  7913.  
  7914. The  range  of shapes to be saved is specified by Shape#,Shape#,  where  the
  7915. first  Shape#  refers to the lowest shape to be saved and the second  Shape#
  7916. the highest.
  7917.  
  7918. Page 149
  7919.  
  7920. GetaShape Shape#,X, Y, Width,Height
  7921.  
  7922. GetaShape lets you transfer a rectangular area of the currently used  bitmap
  7923. into the specified shape object.  X, Y, Width and Height specify the area of
  7924. the bitmap to be picked up and used as a shape.
  7925.  
  7926. CopyShape Shape#,Shape#
  7927.  
  7928. CopyShape  will produce an exact copy of one shape object in  another  shape
  7929. object. The first Shape# specifies the source shape for the copy, the second
  7930. specifies the destination shape.
  7931.  
  7932. CopyShape is often used when you require two copies of a shape in  order  to
  7933. manipulate (using, for example, XFlip) one of them.
  7934.  
  7935. AutoCookie Onl Off
  7936.  
  7937. When  shapes objects are used by any of the blitting routines (for  example,
  7938. Blit),   they usually require the presence of what is known as a'cookiecut'.
  7939. These  cookiecuts  are used for internal purposes by  the  various  blitting
  7940. commands, and in no way affect the appearance or properties of a shape. They
  7941. do, however, consume some of your valuable Chip memory.
  7942.  
  7943. When a shape is created (for example,  by using LoadShape or GetaShape),   a
  7944. cookiecut is automatically made for it.  However, this feature may be turned
  7945. off by executing an AutoCookie Off.
  7946.  
  7947. This  is a good idea if you are not going to be using shapes for blitting  -
  7948. for example, shapes used for gadgets or menus.
  7949.  
  7950. MakeCookie Shape#
  7951.  
  7952. MakeCookie  allows  you  to create a'cookiecut'  for  an  individual  shape.
  7953. Cookiecuts  are  necessary for shapes which are to be used  by  the  various
  7954. blitting commands (for example,  QBlit), and are normally made automatically
  7955. whenever a shape is created (for example,  using LoadShape). However, use of
  7956. the  AutoCookie  command may mean you end up  with  a  shape  which  has  no
  7957. cookiecut,   but which youi wish to blit at some stage.  You  can  then  use
  7958. MakeCookie to make a cookiecut for this shape.
  7959.  
  7960. ShapeWidth (Shape#)
  7961.  
  7962. The  ShapeWidth  function returns the width,  in pixels,   of  a  previously
  7963. created shape object.
  7964.  
  7965. ShapeHeight (Shape#)
  7966.  
  7967. The  ShapeHeight function returns the height,  in pixels,  of  a  previously
  7968. created shape object.
  7969.  
  7970. Handle Shape#,X,Y
  7971.  
  7972. All shapes have an associated 'handle'. A shape's handle refers to an offset
  7973. from  the  upper  left  of the shape to be used when  calculating  a  shapes
  7974. position  when it gets blitted to a bitmap.  This is also often referred  to
  7975. as a 'hot spot'.
  7976.  
  7977. The X parameter specifies the 'acrosswards' offset for a handle, the Y
  7978.  
  7979. Page 150
  7980.  
  7981. parameter specifies a 'downwards' offset.
  7982.  
  7983. Let's have a look at an example of how a handle works.  Assume you have  set
  7984. a shapes X handle to 5,  and it's Y handle to 10.  Now let's say we blit the
  7985. shape  onto a bitmap at pixel position 160,100.  The handle will  cause  the
  7986. upper  left  corner  of the shape to actually end up at 155,90,   while  the
  7987. point within the shape at 5,10 will end up at 160,100.
  7988.  
  7989. When  a  shape is created,  it's handle is automatically set to 0,0  -  it's
  7990. upper left corner.
  7991.  
  7992. MidHandle Shape#
  7993.  
  7994. MidHandle  will cause the handle of the specified shape to be  set  to  it's
  7995. centre. For example, these two commands achieve exactly the same result:
  7996.  
  7997. MidHandle O Handle O,ShapeWidth(O)/2,ShapeHeight(O)/2
  7998.  
  7999. For more information on handles, please refer to the Handle command.
  8000.  
  8001. XFlip Shape#
  8002.  
  8003. The  XFlip  command is one of Blitz's powerful shape manipulation  commands.
  8004. XFlip will horizontally 'mirror' a shape object,  causing the object  to  be
  8005. 'turned back to front'.
  8006.  
  8007. YFlip Shape#
  8008.  
  8009. The  YFlip  command may be used to vertically 'mirror' a shape object.   The
  8010. resultant shape will appear to have been 'turned upside down'.
  8011.  
  8012. Scale Shape#,X Ratio, Y Ratio[,Palette#]
  8013.  
  8014. Scale  is  a very powerful command which may be used to 'stretch' or'shrink'
  8015. shape objects. The Ratio parameters specify how much stretching or shrinking
  8016. to  perform.  A Ratio greater than one will cause the shape to be  stretched
  8017. (enlarged), while a Ratio of less than one will cause the shape to be shrunk
  8018. (reduced).   A  Ratio  of exactly one will cause no change  in  the  shape's
  8019. relevant dimension.
  8020.  
  8021. As  there  are separate Ratio parameters for both x and y,  a shape  may  be
  8022. stretched along one axis and shrunk along the other!
  8023.  
  8024. The  optional Palette# parameter allows you to specify a palette object  for
  8025. use in the scaling operation.  If a Palette# is supplied,  the scale command
  8026. will use a 'brightest pixel' method of shrinking.  This means a shape may be
  8027. shrunk to a small size without detail being lost.
  8028.  
  8029. Rotate Shape#,Angle Ratio
  8030.  
  8031. The  Rotate  command  allows  you to rotate a  shape  object.   Angle  Ratio
  8032. specifies how much clockwise rotation to apply,  and should be in the  range
  8033. zero to one.  For instance,  an Angle Ratio of .5 will cause a shape  to  be
  8034. rotated 180 degrees,  while an Angle Ratio of .25 will cause a shape  to  be
  8035. rotated 90 degrees clockwise.
  8036.  
  8037. Page 151
  8038.  
  8039. DecodeShapes Shape#[,Shape#],MemoryLocation
  8040.  
  8041. DecodeShapes,  similar to DecodeMedModule ensures the data is  in  chip  and
  8042. then configures the Shape object(s) to point to the data.
  8043.  
  8044. InitShape Shape#, Width,Height,Depth
  8045.  
  8046. InitShape  has been added to simple create blank shape objects.  Programmers
  8047. who  make a habit of using ShapesBitMap to render graphics to a shape object
  8048. will appreciate this one for sure.
  8049.  
  8050. Page 152
  8051.  
  8052. R-17: BLITTING COMMANDS
  8053.  
  8054. The  process  of  putting a shape onto a bitmap using the blister  is  often
  8055. referred to as 'blitting' a shape.  The speed at which a shape is blitted is
  8056. important when you are writing animation routines,  as the smoothness of any
  8057. animation wil1 be directly affected by how long it takes to draw the  shapes
  8058. involved in the animation.
  8059.  
  8060. The two main factors which affect the speed at which a shape is blitted  are
  8061. it's size and the technique used to actually blit the shape.
  8062.  
  8063. This  section  will cover all commands which allow you to draw  shapes  onto
  8064. bitmaps using the Amiga's 'blister' chip.
  8065.  
  8066. Blit Shape#,X, Y[,Excessonoff]
  8067.  
  8068. Blit is the simplest of all the blitting commands.  Blit will simply draw  a
  8069. shape  object onto the currently used bitmap at the pixel position specified
  8070. by  X,Y.   The  shape's handle,  if any,  will be taken  into  account  when
  8071. positioning the blit.
  8072.  
  8073. The optional Excessonoff parameter only comes into use if you are blitting a
  8074. shape  which has less bitplanes (colours)  than the bitmap to  which  it  is
  8075. being  blitted.  In this case,  Excessonoff allows you to specify an  on/off
  8076. value for the excess bitplanes - ie,  the bitplanes beyond those altered  by
  8077. the  shape.   Bit zero of Excessonoff will specify an on/off value  for  the
  8078. first  excess  bitplane,   bit one an on/off value  for  the  second  excess
  8079. bitplane and so on.
  8080.  
  8081. The  manner  in which the shape is drawn onto the bitmap may be  altered  by
  8082. use of the BlitMode command.
  8083.  
  8084. BlitMode BLTCON0
  8085.  
  8086. The  BlitMode command allows you to specify just how the Blit  command  uses
  8087. the blister when drawing shapes to bitmaps.  By default,  BlitMode is set to
  8088. a tcookiemode' which simply draws shapes 'as is'.  However, this mode may be
  8089. altered to produce other useful ways of drawing.  Here are just some of  the
  8090. possible BLTCON0 parameters and their effects:
  8091.  
  8092. CookieMode:  Shapes are drawn 'as is'. EraseMode: An area the size and shape
  8093. of the shape willbe 'erased' on the destination bitmap.
  8094.  
  8095. InvMode:  An area the size and shape of the shape willbe 'inversed'  on  the
  8096. destination bitmap.  SolidMode:  The shape will be drawn as a solid area  of
  8097. one colour.
  8098.  
  8099. Actually,  these modes are all just special functions which return a  useful
  8100. value.   Advanced  programmers may be interested to know  that  the  BLTCON0
  8101. parameter  is  used by the Blit command's blister routine to  determine  the
  8102. blister MINITERM and CHANNEL USE flags.  Bits zero through seven specify the
  8103. miniterm,   and  bits  eight through eleven specify  which  of  the  blister
  8104. channels are used.  For the curious out there,  all the blister routines  in
  8105. Blitz assume the following blister channel setup:
  8106.  
  8107. Page 153
  8108.  
  8109.  
  8110.  
  8111. BlitterChannei Used For
  8112.  
  8113.     A    Pointer to shape's cookie cut
  8114.     B    Pointer to shape data
  8115.     C    Pointer to destination
  8116.     D    Pointer to destination
  8117.  
  8118. CookieMode
  8119.  
  8120. The  CookieMode function returns a value which may be used  by  one  of  the
  8121. commands involved in blitting modes.
  8122.  
  8123. Using  CookieMode  as  a blitting mode will cause  a  shape  to  be  blitted
  8124. cleanly, 'as is', onto a bitmap.
  8125.  
  8126. EraseMode
  8127.  
  8128. The  EraseMode  function  returns a value which  may  be  used  by  one  the
  8129. commands involved in blitting modes.
  8130.  
  8131. Using  EraseMode as a blitting mode will cause a blitted shape  to  erase  a
  8132. section of a bitmap corresponding to the outline of the shape.
  8133.  
  8134. InvMode
  8135.  
  8136. The  InvMode function returns a value which may be used by one the  commands
  8137. involved in blitting modes.
  8138.  
  8139. Using  InvMode as a blitting mode will cause a shape to 'invert'  a  section
  8140. of a bitmap corresponding to the outline of the blitted shape.
  8141.  
  8142. SolidMode
  8143.  
  8144. The  SolidMode  function  returns a value which  may  be  used  by  one  the
  8145. commands involved in blitting modes.
  8146.  
  8147. Using SolidMode as a blitting mode will cause a shape to overwrite a section
  8148. of a bitmap corresponding to the outline of the blitted shape.
  8149.  
  8150. Clueue Queue#,Max Items
  8151.  
  8152. The  Queue command creates a queue object for use with the QBlit and UnQueue
  8153. commands.  What is a queue? Well,  queues (in the Blitz sense)  are used for
  8154. the  purpose of multi-shape animation.  Before going into what a  queue  is,
  8155. let's have a quick look at the basics of animation.
  8156.  
  8157. Say you want to get a group of objects flying around the screen.  To achieve
  8158. this, you will have to construct a loop similar to the following:
  8159.  
  8160. Step l:  Start at the first object Step 2: Erase the object from the display
  8161. Step 3:  Move the object Step 4: Draw the object at it's new location on the
  8162. display Step 5:  If there are any more objects to move,  go on to  the  next
  8163. object and then go to step 2, else... Step 6: go to step l
  8164.  
  8165. Page 154
  8166.  
  8167.  
  8168.  
  8169. Step 2 is very important,  as if it is left out,  all the objects will leave
  8170. trails behind them!  However,  it is often very cumbersome to have to  erase
  8171. every  object  you wish to move.  This is where queues are  of  use.   Using
  8172. queues,  you can 'remember' all the objects drawn through a loop,  then,  at
  8173. the  end  of  the  loop (or at the start of the next loop),  erase  all  the
  8174. objects 'remembered' from the previous loop.  Lets have a look at  how  this
  8175. works:
  8176.  
  8177. Step l: Erase all objects remembered in the queue
  8178.  
  8179. Step 2:  Start at the first object Step 3:  Move the object Step 4: Draw the
  8180. object at it's new location,  and add it to the end of the queue Step 5:  If
  8181. there are any objects left to move,  go on to the next object,  then  go  to
  8182. step 3; else... Step 6: Go to step l
  8183.  
  8184. This  is  achieved  quite easily using Blitz's queue  system.   The  UnQueue
  8185. command performs step l, and the QBlit command performs step 4.
  8186.  
  8187. Queues  purpose  is to initialize the actual queue used to remember  objects
  8188. in.  Queue must be told the maximum number of items the queue is capable  of
  8189. remembering, which is specified in the Max Items parameter.
  8190.  
  8191. QBlit Queue#,Shape#,X, YLExcessonoff]
  8192.  
  8193. QBlit performs similarly to Blit,  and is also used to draw a shape onto the
  8194. currently used bitmap.  Where QBlit differs,  however,  is in that  it  also
  8195. remembers (using a queue)  where the shape was drawn,  and how big  it  was.
  8196. This allows a later UnQueue command to erase the drawn shape.
  8197.  
  8198. Please refer to the Queue command for an explanation of the use of queues.
  8199.  
  8200. The  optional  Excessonoff parameter works identically  to  the  Excessonoff
  8201. parameter  used by the Blit command.  Please refer to the Blit  command  for
  8202. more information on rhis parameter.
  8203.  
  8204. UnQueue Queue#[,BitMap#]
  8205.  
  8206. UnQueue is used to erase all 'remembered' items in a queue. Items are placed
  8207. in  a  queue by use of the QBlit command.  Please refer to Queue for a  full
  8208. explanation of queues and their usage.
  8209.  
  8210. An  optional BitMap# parameter may be supplied to cause items to  be  erased
  8211. by  way  of  'replacement' from another bitmap,  as opposed  to  the  normal
  8212. 'zeroing out' erasing.
  8213.  
  8214. FlushQueue Queue#
  8215.  
  8216. FlushQueue  will force the specified queue object to be 'emptied',   causing
  8217. the next UnQueue command to have no effect.
  8218.  
  8219. QBlitMode BLTCON0
  8220.  
  8221. QBlitMode  allows  you  to control how the blister operates  when  QBlitting
  8222. shapes  to bitmaps.  Please refer to BlitMode for more information  on  this
  8223. command.
  8224.  
  8225. Page 155
  8226.  
  8227. Buffer Buffer#,Memorylen
  8228.  
  8229. The Buffer command is used to create a buffer object. Buffers are similar to
  8230. queues in concept,  but operate slightly differently.  If you have  not  yet
  8231. read the description of the Queue command,  it would be a good idea to do so
  8232. before continuing here.
  8233.  
  8234. The buffer related commands are very similar to the queue related commands -
  8235. Buffer,  BBlit,  and UnBuffer,  and are used in exactly the same way.  Where
  8236. buffers  differ  from  queues,  however,  is in their  ability  to  preserve
  8237. background  graphics.   Whereas  an UnQueue  command  normally  trashes  any
  8238. background graphics,  UnBuffer will politely restore whatever the BBlits may
  8239. have overwritten.  This is achieved by the BBlit command actually performing
  8240. two bliss.
  8241.  
  8242. The first blit transfers the area on the bitmap which the shape is about  to
  8243. cover  to  a  temporary storage area - the second blit  actually  draws  the
  8244. shape  onto  the bitmap.  When the time comes to UnBuffer all those  BBlits,
  8245. the  temporary  storage  areas will be transferred  back  to  the  disrupted
  8246. bitmap.
  8247.  
  8248. The Memorylen parameter of the Buffer command refers to how much memory,  in
  8249. bytes,   should  be put aside as temporary storage for the  preservation  of
  8250. background graphics.  The value of this parameter varies depending upon  the
  8251. size  of  shapes  to be BBlited,  and the maximum number  of  shapes  to  be
  8252. BBlited between UnBuffers.
  8253.  
  8254. A  Memorylen of 16384 should be plenty for most situations,  but may need to
  8255. be increased if you start getting 'Buffer Overflow' error messages.
  8256.  
  8257. BBlit Buffer#,Shape#,X, YtExcessonoff]
  8258.  
  8259. The  BBlit  command is used to draw a shape onto the currently used  bitmap,
  8260. and preserve the overwritten area into a previously initialized buffer.  For
  8261. more information on how buffers work, please refer to the Buffer command.
  8262.  
  8263. The  optional  Excessonoff parameter works identically  to  the  Excessonoff
  8264. parameter  used by the Blit command.  Please refer to the Blit  command  for
  8265. more information on this parameter.
  8266.  
  8267. UnBuffer Buffer#
  8268.  
  8269. UnBuffer is used to 'replace' areas on a bitmap overwritten by a  series  of
  8270. BBlit commands.  For more information on buffers, please refer to the Buffer
  8271. command.
  8272.  
  8273. FlushBuffer Buffer#
  8274.  
  8275. FlushBuffer will force the specified buffer object to be 'emptied',  causing
  8276. the next UnBuffer command to have no effect.
  8277.  
  8278. BBlitMode BLTCON0
  8279.  
  8280. BBlitMode  allows  you  to control how the blister operates  when  BBlitting
  8281. shapes  to bitmaps.  Please refer to BlitMode for more information  on  this
  8282. command.
  8283.  
  8284. Page 156
  8285.  
  8286. Stencil Stencil#,BitMap#
  8287.  
  8288. The Stencil command will create a stencil object based on the contents of  a
  8289. previously created bitmap. The stencil will contain information based on all
  8290. graphics  contained  in the bitmap,  and may be  used  with  the  SBlit  and
  8291. ShowStencil commands.
  8292.  
  8293. SBlit Stencil#,Shape#,X,Y[,Excessonoff]
  8294.  
  8295. SBlit works identically to the Blit command,  and also updates the specified
  8296. Stencil#. This is an easy way to render 'foreground' graphics to a bitmap.
  8297.  
  8298. SBlitMode BLTCONO
  8299.  
  8300. SBlitmode is used to determine how the SBlit command operates.  Please refer
  8301. to the BlitMode command tor more information on blitting modes.
  8302.  
  8303. ShowStencil Buffer#,Stencil#
  8304.  
  8305. ShowStencil  is  used  in  connection with BBlits  and  stencil  objects  to
  8306. produce a 'stencil' effect.  Stencils allow you create the effect of  shapes
  8307. moving  'between'  background  and   foreground  graphics.   Used  properly,
  8308. stencils can add a sense of 'depth' or'three dimensionality' to animations.
  8309.  
  8310. So what steps are involved in using stencils? To begin with, you need both a
  8311. bitmap  and a stencil object.  A stencil object is similar to  a  bitmap  in
  8312. that it contains various graphics.  Stencils differ,  however,  in that they
  8313. contain  no  colour information.  They simply determine where  graphics  are
  8314. placed on the stencil.  The graphics on a stencil usually correspond to  the
  8315. graphics representing 'foreground' scenery on a bitmap.
  8316.  
  8317. So  the first step is to set up a bitmap with both foreground and background
  8318. scenery on it.  Next,  a stencil is set up with only the foreground  scenery
  8319. on it.  This may be done using either the Stencil or SBlit command.  Now, we
  8320. BBlit our shapes.  This will,  of course,  place all the shapes in front  of
  8321. both  the background and the foreground graphics.  However,  once all shapes
  8322. have  been  BBlitted,   executing the ShowStencil command  will  repair  the
  8323. damage done to the foreground graphics!
  8324.  
  8325. Block Shape#,X, Y
  8326.  
  8327. Block  is  an  extremely  fast  version   of  the  Blit  command  with  some
  8328. restrictions.  Block should only be used with shapes that are 16,32,48,64...
  8329. pixels  wide and that are being blitted to an x position of 0,16,32,48,64...
  8330. Note  that the height and y destination of the shape are not limited by  the
  8331. Block command.
  8332.  
  8333. Block is intended tor use with map type displays.
  8334.  
  8335. BlitColl (Shape#,x,y)
  8336.  
  8337. BlitColl is a fast way of collision detection when blitting shapes. BlitColl
  8338. returns - I if a collision occurs,  O if no collision. A collision occurs if
  8339. any  pixel  on  the current BitMap is non zero where your shape  would  have
  8340. been blitted.
  8341.  
  8342. ShapesHit  is  faster  but less accurate as it checks only  the  rectangular
  8343. area  of each shape,  where as BlitColl takes into account the shape of  the
  8344. shape and of course can not tell you what shape you have collided with.
  8345.  
  8346. Page 157
  8347.  
  8348. ClipBlit ClipBlit Shape#,X, Y
  8349.  
  8350. ClipBlit  is  the  same as the Blit command except ClipBlit  will  clip  the
  8351. shape to the inside of the used bitmap,  all blit commands in Blitz are  due
  8352. to be expanded with this feature.
  8353.  
  8354. ClipBlitMode BPLCON0
  8355.  
  8356. Same  as BlitMode except applies to the ClipBlit command.  Another oversight
  8357. now fixed.
  8358.  
  8359. BlockScroll X1, Y1, Width,Height,X2, Y2[,BitMap#]
  8360.  
  8361. Same  as the Scroll command except that BlockScroll is much faster but  only
  8362. works with 16 bit aligned areas.  This means that Xl,  X2 and Width must all
  8363. be  multiples  of 16.  Useful for block scrolling routines that  render  the
  8364. same blocks to both sides of the display,  the programmer can now choose  to
  8365. render  just  one set and then copy the result to the other  side  with  the
  8366. BlockScroll command.
  8367.  
  8368. Page 158
  8369.  
  8370. R-18: SPRITE HANDLING COMMANDS
  8371.  
  8372. Sprites  are another way of producing moving objects on the Amiga's display.
  8373. Sprites are,  like shapes, graphical objects. However unlike shapes, sprites
  8374. are  handled  by  the Amiga's hardware completely separately  from  bitmaps.
  8375. This  means  that sprites do not have to be erased when it's  time  to  move
  8376. them,   and that sprites in no way destroy or interfere with bitmap graphics
  8377. Also,   once  a sprite has been displayed,  it need not be referenced  again
  8378. until it has to be moved.
  8379.  
  8380. In this release of Blitz,  sprites are only available in Blitz mode and have
  8381. either 3 or 15 colours (2 or 4 bitplanes).  Each slice may display a maximum
  8382. of  up  to 8 sprites.  Other conditions may lower this maximum such  as  the
  8383. width,  depth and resolution of the slice.  The Amiga hardware has 8  sprite
  8384. channels,   standard 16 wide 3 colour sprites require a single channel,   15
  8385. colour  sprites  need  two  and sprites wider than  16  will  require  extra
  8386. channels  also.   15 color sprites must use an even numbered  channel,   the
  8387. subsequent odd channel then becomes unavailable.
  8388.  
  8389. Sprites  also  require  a  special colour palette set  up.   Fifteen  colour
  8390. sprites  take their RGB values from colour registers 17 through  31.   Three
  8391. colour  sprites,   however,  take on RGB values depending  upon  the  sprite
  8392. channels  being  used  to  display them.  The following  table  shows  which
  8393. palette registers at'fect which sprite channels:
  8394.  
  8395. Sprite Channel            Colour Registers
  8396. 0,1                    17-19
  8397. 2,3                    21 -23
  8398. 4,5                    25-27
  8399. 6,7                    29-31
  8400.  
  8401. GetaSprite Sprite#,Shape#
  8402.  
  8403. To be able to display a sprite,  you must first create a sprite object. This
  8404. will contain the image information for the sprite.  GetaSprite will transfer
  8405. the  graphic  data contained in a shape object into a sprite  object.   This
  8406. allows  you  to  perform  any of the Blitz shape manipulation  commands  (eg
  8407. Scale or Rotate) on a shape before creating a sprite from the shape.
  8408.  
  8409. Once  GetaSprite has been executed,  you may not require  the  shape  object
  8410. anymore.  In this case,  it is best to t'ree up the shape object (using Free
  8411. Shape) to conserve as much valuable chip memory as possible.
  8412.  
  8413. ShowSprite Sprite#,X, Y,Sprite Channel
  8414.  
  8415. ShowSprite is the command used to actually display a sprite through a sprite
  8416. channel.   X  and Y specify the position the sprite is to be  displayed  at.
  8417. These  parameters are ALWAYS given in lo-resolution pixels.  Sprite  Channel
  8418. is  a value 0 through 7 which decides which sprite channel the sprite should
  8419. be display through.
  8420.  
  8421. InFront Sprite Channel
  8422.  
  8423. A feature of sprites is that they may be displayed either 'in front of' or
  8424.  
  8425. Page 159
  8426.  
  8427. 'behind'  the  bitmap graphics they are appearing in.  The  InFront  command
  8428. allows you to determine which sprites appear in front of bitmaps,  and which
  8429. sprites appear behind.
  8430.  
  8431. Sprite  Channel  must be an even number in the range  0  through  8.   After
  8432. executing  an  InFront command,  sprites displayed through  sprite  channels
  8433. greater  than  or  equal  to Sprite Channel will appear  BEHIND  any  bitmap
  8434. graphics.  Sprites displayed through channels less than Sprite Channel  will
  8435. appear  IN  FRONT OF any bitmap graphics.  For example,  after executing  an
  8436. InFront 4,  any sprites displayed through sprite channels 4,5,6  or  7  will
  8437. appear  behind  any  bitmap graphics,  while any sprites  displayed  through
  8438. sprite channels 0,1,2 or 3 will appear in front of any bitmap graphics.
  8439.  
  8440. InFront should only be used in non-dualplayfield slices.
  8441.  
  8442. InFrontF Sprite Channel
  8443.  
  8444. InFrontF  is  used  on  dualplayfield slices to  determine  sprite/playfield
  8445. priority  with  respect to the foreground playfield.  Using combinations  of
  8446. InFrontF  and InFrontB (used for the background playfield),  it is  possible
  8447. to  display  sprites at up to 3 ditterent depths - some  in  front  of  both
  8448. playfields, some between the playfields, and some behind both playfields.
  8449.  
  8450. InFrontB Sprite Channel
  8451.  
  8452. InFrontB  is  used  on  dualplayfield slices to  determine  sprite/playtield
  8453. priority  with  respect to the background playtield.  Using combinations  of
  8454. InFrontB  and InFrontF (used tor the foreground playfield),  it is  possible
  8455. to  display  sprites at up to 3 different depths - some  in  front  of  both
  8456. playfields, some between the playfields, and some behind both playfields.
  8457.  
  8458. LoadSprites Sprite#[,Sprite#],Filename$
  8459.  
  8460. LoadSprites lets you load a 'range' of sprites from disk into  a  series  of
  8461. sprite  objects.  The file specified by Filename$ should have  been  created
  8462. using  the  SaveSprites command.  The first Sprite# parameter specifies  the
  8463. number  of  the first sprite object to be loaded.  Further sprites  will  be
  8464. loaded  into  increasingly  higher sprite  objects.   If  a  second  Sprite#
  8465. parameter  is  supplied,  then only sprites up to and including  the  second
  8466. Sprite# value will be loaded.  If there are not enough sprites in  the  file
  8467. to fill this range, any excess sprites will remain untouched.
  8468.  
  8469. SaveSprites Sprite#,Sprite#,Filename$
  8470.  
  8471. SaveSprites  allows  you  to  create a file containing  a  range  of  sprite
  8472. objects. This file may be later loaded using the LoadSprites command.
  8473.  
  8474. The range of sprites to be saved is specified by Sprite#,Sprite#,  where the
  8475. first  Sprite#  refers  to the lowest sprite to  be  saved  and  the  second
  8476. Sprite# the highest.
  8477.  
  8478. SpriteMode mode
  8479.  
  8480. For  use with the capabilities of the new Display library SpriteMode is used
  8481. to  define the width of sprites to be used in the program.  The mode  values
  8482. 0, l and 2 correspong to the widths l 6, 32 and 64
  8483.  
  8484. Page 160
  8485.  
  8486. R-l9: COLLISION DETECTION COMMANDS
  8487.  
  8488. This section deals with various commands involved in the detection of object
  8489. collisions.
  8490.  
  8491. SetColl Colour,BitplanesLPlaylield]
  8492.  
  8493. There  are  3  different  commands  involved  in  controlling  sprite/bitmap
  8494. collision  detection,  of which SetColl is one (the other 2 being SetCollOdd
  8495. and  SetCollHi).  All three determine what colours in a bitmap will cause  a
  8496. collision with sprites.  This allows you to design bitmaps with  'safe'  and
  8497. 'unsafe' areas.
  8498.  
  8499. SetColl  allows  you to specify a single colour which,  when  present  in  a
  8500. bitmap,  and in contact with a sprite,  will cause a collision.  The  Colour
  8501. parameter refers to the 'collidable' colour.  Bitplanes refers to the number
  8502. of bitplanes (depth) that bitmap collision are to be tested in.
  8503.  
  8504. The optional PlayField parameter is only used in a dualplayfield slice.   If
  8505. Playfield is 1,  then Colour refers to a colour in the foreground bitmap. If
  8506. Playfield is 0, then Colour refers to a colour in the background bitmap.
  8507.  
  8508. DoColl  and  PColl  are  the  commands   used  for  actually  detecting  the
  8509. collisions.
  8510.  
  8511. SetCollOdd
  8512.  
  8513. SetCollOdd  is  used  to control the detection of sprite/bitmap  collisions.
  8514. SetCollOdd  will  cause  ONLY  the   collisions  between  sprites  and  'odd
  8515. coloured'  bitmap  graphics to be reported.  Odd  coloured  bitmap  graphics
  8516. refers  to  any  bitmap  graphics rendered in  an  odd  colour  number  (de:
  8517. 1,3,5...).   This allows you to design bitmap graphics in such  a  way  that
  8518. even  coloured  areas  are 'safe' (de:  they will not  report  a  collision)
  8519. whereas odd colour areas are 'unsafe' (de: they will report a collision).
  8520.  
  8521. The  DoColl  and  PColl commands are used to detect the actual sprite/bitmap
  8522. collisions.
  8523.  
  8524. SetCollHi EJitPlanes
  8525.  
  8526. SetCollHi may be used to enable sprite/bitmap collisions between sprites and
  8527. the  'high half' colour range of a bitmap.  For example,  if you have  a  16
  8528. colour bitmap, the high half of the colours would be colours 8 through 15.
  8529.  
  8530. The BitPlanes parameter should be set to the number of bitplanes (depth)  of
  8531. the bitmap with which collisions should be detected.
  8532.  
  8533. Please  refer  to the SetColl command for more information on  sprite/bitmap
  8534. collisions.
  8535.  
  8536. DoColl
  8537.  
  8538. DoColl is used to perform sprite/bitmap collision checking.  Once DoColl  is
  8539. executed,   the  PColl  and/or SColl functions may  be  used  to  check  for
  8540. sprite/bitmap or sprite/sprite collisions.
  8541.  
  8542. Before DoColl may be used with PColl,  the type of bitmap collisions  to  be
  8543. detected  must have been specified using one of the SetColl,  SetCollOdd  or
  8544. SetCollHi commands.
  8545.  
  8546. Page 161
  8547.  
  8548. After executing a DoColl,  PColl and SColl will return the same values until
  8549. the next time DoColl is executed.
  8550.  
  8551. PColl (Sprite Channel)
  8552.  
  8553. The  PColl  function  may  be used to find out if a  particular  sprite  has
  8554. collided  with any bitmaps.  Sprite Channel refers to the sprite channel  of
  8555. the sprite you wish to check is being displayed through.
  8556.  
  8557. If  the specified sprite has collided with any bitmap graphics,  PColl  will
  8558. return a true (-l ) value, otherwise PColl will return false (O).
  8559.  
  8560. Before  using  PColl,  a DoColl must previously have been executed.   Please
  8561. refer to DoColl for more information.
  8562.  
  8563. SColl (Sprite Channel, Sprite Channel)
  8564.  
  8565. SColl  may  be  used to determine whether the 2 sprites currently  displayed
  8566. through  the specified sprite channels have collided.  If they have,   SColl
  8567. will return true (- l ),  otherwise SColl will return false (O).  DColl must
  8568. have been executed prior to using SColl.
  8569.  
  8570. ShapesHit (Shape#,X, Y,Shape#,X, Y)
  8571.  
  8572. The ShapesHit function will calculate whether the rectangular areas occupied
  8573. by  2  shapes overlap.  ShapesHit will automatically take the shape  handles
  8574. into  account.  If the 2 shapes overlap,  ShapesHit will return  true  (-l),
  8575. otherwise ShapesHit will return false (O).
  8576.  
  8577. ShapeSpriteHit (Shape#,X, Y,Sprite#,X, Y)
  8578.  
  8579. The  ShapeSpriteHit  function will calculate whether  the  rectangular  area
  8580. occupied by a shape at one position,  and the rectangular area occupied by a
  8581. sprite at another position are overlapped. If the areas do overlap,
  8582.  
  8583. ShapeSpriteHit  will  return  true (- l ),   otherwise  ShapeSpriteHit  will
  8584. return  false (O).  ShapeSpriteHit automatically takes the handles  of  both
  8585. the shape and the sprite into account.
  8586.  
  8587. SpritesHit (Sprite#,X, Y,Sprite#,X, Y)
  8588.  
  8589. The  SpritesHit  function  will  calculate  whether  the  rectangular  areas
  8590. occupied  by  2  sprites  overlap.  SpritesHit will automatically  take  the
  8591. sprite  handles  into account.  If the 2 sprites overlap,   SpritesHit  will
  8592. return true (- l ), otherwise SpritesHit will return false (O).
  8593.  
  8594. Care should be taken with the pronunciation of this command.
  8595.  
  8596. RectsHit (X1, Y1, Widthl,Height1,X2, Y2, Width2,Height2)
  8597.  
  8598. The  RectsHit  function  may  be  used  to  determine  whether  2  arbitrary
  8599. rectangular  areas  overlap.  If the specified  rectangular  areas  overlap,
  8600. RectsHit will return true (- l ), otherwise RectsHit will return false (O).
  8601.  
  8602. Care should be taken with the pronunciation of this command.
  8603.  
  8604. Page 162
  8605.  
  8606. R-20: PALETTE COMMANDS
  8607.  
  8608. Amiga  colours are represented as values for the three primary colours  red,
  8609. green  and  blue.  These values are combined as an RGB value.  Palettes  are
  8610. Blitz  objects  that  contain  a series of RGB  values  that  represent  the
  8611. colours used by the display.
  8612.  
  8613. Palette  information can be loaded from an IFF file  or  defined  using  the
  8614. PalRGB/AGAPalRGB commands.  Palettes can be assigned to screens  and  slices
  8615. with both the Use Palette and ShowPalette commands.
  8616.  
  8617. Many commands are available for manipulating the colours within a palette.
  8618.  
  8619. Colour  values  on  slices and screens can also be changed directly  without
  8620. the use of palettes using the RGB and AGARGB commands.
  8621.  
  8622. Load Pa lette Palette#, Filename$[, Palette Offset]
  8623.  
  8624. LoadPalette  creates and initializes a palette object.  Filename$  specifies
  8625. the  name  of an ILBM IFF file containing colour information.  If  the  file
  8626. contains  colour  cycling information,  this will also be  loaded  into  the
  8627. palette object.
  8628.  
  8629. An  optional Palette Offset may be specified to allow the colour information
  8630. to be loaded at a specified point (colour register)  in the palette. This is
  8631. especially  useful in the case of sprite colours,  as these  must  begin  at
  8632. colour register sixteen.
  8633.  
  8634. LoadPalette does not actually change any display colours.  Once a palette is
  8635. loaded, Use Palette can be used to cause display changes.
  8636.  
  8637. ShowPalette Palette#
  8638.  
  8639. ShowPalette  replaces  Use Palette for copying a palette's  colours  to  the
  8640. current Screen or Shce.
  8641.  
  8642. Use Palette Palette#
  8643.  
  8644. Use  Palette  transfers  palette information from  a  palette  object  to  a
  8645. displayable  palette.   If executed in Amiga mode,  palette  information  is
  8646. transferred into the palette of the currently used Screen.  If  executed  in
  8647. Blitz  mode,   palette information is transferred into the  palette  of  the
  8648. currently used Slice.
  8649.  
  8650. NewPaletteMode Onl Off
  8651.  
  8652. The  NewPaletteMode flag has been added for compatibility with  older  Blitz
  8653. programs.   By  setting NewPaletteMode to On the Use Palette command  merely
  8654. makes the specified palette the current object and does not try to copy  the
  8655. colour information to the current Screen or Slice.
  8656.  
  8657. Free Palette Palette#
  8658.  
  8659. Free  Palette  erases  all information in a palette  object.   That  Palette
  8660. object may no longer be Used or Cycled.
  8661.  
  8662. Page 163
  8663.  
  8664.  
  8665.  
  8666. SavePalette Palette#,FileName$
  8667.  
  8668. Creates a standard IFF "CMAP" file using the given Palette's colors.
  8669.  
  8670. CyclePalette Palette#
  8671.  
  8672. CyclePalette  uses  the  standard color cycling parameters  in  the  palette
  8673. object  to  cycle  the colors.  Unlike the Cycle command  which  copied  the
  8674. resulting  palette  to  the  current screen the  CyclePalette  command  just
  8675. modifies  the  palette object and can hence be used with  the  DisplayBitmap
  8676. command in the new Display library.
  8677.  
  8678. FadePalette SrcPaleffe#,DestPalette#, Brightness. q ;palettelib
  8679.  
  8680. FadePalette  multiplies all colours in a Palette by the Brightness  argument
  8681. and maces the result in the DestPalette.
  8682.  
  8683. lnitPalette Palette#,NumColors
  8684.  
  8685. InitPalette  simply  initialises a palette object to  hold  NumColors.   All
  8686. colors will be set to black.
  8687.  
  8688. DecodePalette Palette#,MemoryLocationt Palette Offset]
  8689.  
  8690. DecodePalette  allows  the  programmer   to   unpack  included  iff  palette
  8691. information to Blitz palette objects.
  8692.  
  8693. Pal RG B Palette#, Colour Register,Bed, Green,Blue
  8694.  
  8695. PalRGB  allows  you to set an individual colour register  within  a  palette
  8696. object.  Unless an RGB has also been executed, the actual colour change will
  8697. not come into effect until the next time ShowPalette is executed.
  8698.  
  8699. RGB Colour Register,Red,Green,Blue
  8700.  
  8701. RGB  enables you to set individual colour registers in a palette to  an  RGB
  8702. colour value.  If executed in Amiga mode,  RGB sets colour registers in  the
  8703. currently used screen.  If executed in Blitz Mode, RGB sets colour registers
  8704. in  the  currently used slice.  Note that RGB does not alter palette objects
  8705. in any
  8706.  
  8707. Red (Colour Register)
  8708.  
  8709. Red  returns  the  amount  of RGB red in a specified  colour  register.   If
  8710. executed  in  Amiga mode,  Red returns the amount of red  in  the  specified
  8711. colour  register of the currently used screen.  If executed in  Blitz  mode,
  8712. Red  returns  the  amount of red in the specified  colour  register  of  the
  8713. currently used slice.  Red will always return a value in the range  zero  to
  8714. fifteen.
  8715.  
  8716. Green (Colour llegister)
  8717.  
  8718. Green  returns the amount of RGB green in a specified colour  register.   If
  8719. executed  in Amiga mode,  Green returns the amount of green in the specified
  8720. colour  register of the currently used screen.  If executed in  Blitz  mode,
  8721. Green
  8722.  
  8723. Page 164
  8724.  
  8725. returns  the  amount  of  green  in the specified  colour  register  of  the
  8726. currently used slice.  Green will always return a value in the range zero to
  8727. fifteen.
  8728.  
  8729. Blue (Colour Register)
  8730.  
  8731. Blue  returns  the  amount of RGB blue in a specified colour  register.   If
  8732. executed  in  Amiga mode,  Blue returns the amount of blue in the  specified
  8733. colour  register of the currently used screen.  If executed in  Blitz  mode,
  8734. Blue  returns  the amount of blue in the specified colour  register  of  the
  8735. currently used slice.
  8736.  
  8737. Blue will always return a value in the range zero to fifteen.
  8738.  
  8739. AGARGB Colour Register,Red,Green,Blue
  8740.  
  8741. The  AGARGB  command is the AGA equivalent of the RGB command.   The  'Red',
  8742. 'Green'  and  'Blue' parameters must be in the range O through  255,   while
  8743. 'Colour  Register'  is  limited to the number of colours  available  on  the
  8744. currently used screen.
  8745.  
  8746. AGAPalRGB Palette#, Colour Register,Red,Green,Blue
  8747.  
  8748. The  AGAPalRGB  command  is  the  AGA  equivalent  of  the  PalRGB  command.
  8749. AGAPalRGB allows you to set an individual colour register within  a  palette
  8750. object. This command only sets up an entry in a palette object, and will not
  8751. alter the actual screen palette until a 'ShowPalette' is executed.
  8752.  
  8753. AGARed (colour register)
  8754.  
  8755. The  AGARed  function  returns the red component  of  the  specified  colour
  8756. register  within  the  currently used screen.  The returned  value  will  be
  8757. within the range O (being no red) through 255 (being full red).
  8758.  
  8759. AGAGreen (colour register)
  8760.  
  8761. The  AGAGreen  function returns the green component of the specified  colour
  8762. register  within  the  currently used screen.  The returned  value  will  be
  8763. within the range O (being no green) through 255 (being full green).
  8764.  
  8765. AGABlue (colour register)
  8766.  
  8767. The  AGABlue  function returns the blue component of  the  specified  colour
  8768. register  within  the  currently used screen.  The returned  value  will  be
  8769. within the range O (being no blue) through 255 (being full blue).
  8770.  
  8771. SetCycle Palette#, Cycle,Low Colour,High Colour [,Speed]
  8772.  
  8773. SetCycle  is  used  to configure colour cycling information  for  the  Cycle
  8774. command.   The low and high colours specify the range of colours  that  will
  8775. cycle.   You may have a maximum of 7 different cycles for a single  palette.
  8776. The optional parameter Speed specifies how quickly the colours will cycle, a
  8777. negative value will cycle the colours backwards.
  8778.  
  8779. Page 165
  8780.  
  8781.  
  8782.  
  8783. Cycle Palette#
  8784.  
  8785. Cycle  will cause the colour cycling information contained in the  specified
  8786. palette  to  be  cycled  on  the  currently  used  Screen.   Colour  cycling
  8787. information  is  created when LoadPalette is executed or with  the  SetCycle
  8788. command.
  8789.  
  8790. StopCycle  StopCycle  will halt all colour cycling started  with  the  Cycle
  8791. command
  8792.  
  8793. Fadeln Palette#[,RateLLow Colour, High ColourD
  8794.  
  8795. Fadein  will  cause the colour palette of the currently  used  slice  to  be
  8796. 'faded  in'  from  black  up to the RGB values contained  in  the  specified
  8797. Palette#.
  8798.  
  8799. Rate# allows you to control the speed of the fade,  with 0 being the fastest
  8800. fade.   Low Colour and High Colour allow you to control which colour palette
  8801. registers are affected by the fade.
  8802.  
  8803. FadeOut Palette#LRatef Low Colour, High Colour]]
  8804.  
  8805. Fadeout  will  cause the colour palette of the currently used  slice  to  be
  8806. 'faded out' from the RGB values contained in the specified Palette# down  to
  8807. black.
  8808.  
  8809. Rate# allows you to control the speed of the fade,  wilh 0 being the fastest
  8810. fade.   Low Colour and High Colour allow you to control which colour palette
  8811. registers are affected by the fade.
  8812.  
  8813. For  FadeOut to work properly,  the RGB values in the currently  used  slice
  8814. should be set to the specified Palette# prior to using FadeOut.
  8815.  
  8816. ASyncFade Onl Off
  8817.  
  8818. ASyncFade allows you control over how the FadeIn and FadeOut commands  work.
  8819. Normally,   FadeIn and FadeOut will halt program flow,  execute  the  entire
  8820. fade, and then continue program flow. This is ASyncFade Off mode.
  8821.  
  8822. ASyncFade On will cause FadeIn and FadeOut to work differently.  Instead  of
  8823. performing the whole fade at once,  the programmer must execute  the  DoFade
  8824. command to perform the neixt step of the fade.  This allows fading to  occur
  8825. in parallel with program flow.
  8826.  
  8827. DoFade
  8828.  
  8829. DoFade will cause the next step of a fade to be executed.  ASyncFade On, and
  8830. a FadeIn or FadeOut must be executed prior to calling DoFade.
  8831.  
  8832. The  FadeStatus  function may be used to determine  whether  there  are  any
  8833. steps of fading left to perform.
  8834.  
  8835. FadeStatus
  8836.  
  8837. FadeStatus  is used in conjunction with the DoFade command to  determine  if
  8838. any  steps  of fading have yet to be performed.  If a fade process  has  not
  8839. entirely finished yet (de:  more DoFades are required), then FadeStatus will
  8840. return true (-l).  If not, FadeStatus will return false (0). Please refer to
  8841. ASyncFade and DoFade for more information.
  8842.  
  8843. Page 166
  8844.  
  8845.  
  8846.  
  8847. PaletteRange Palette#,StartCol,EndCol,rO,gO,bO,r1,gl,b 1
  8848.  
  8849. PaletteRange  creates  a  spread of colors within  a  palette.   Similar  to
  8850. DPaint's  spread  function PaletteRange takes a start  and  end  colour  and
  8851. creates the color tweens between them.
  8852.  
  8853. DuplicatePalette SrcPalette#,DestPalette#
  8854.  
  8855. DuplicatePalette  simply creates a new Palette  which  exactly  matches  the
  8856. SrcPalette.
  8857.  
  8858. Page 167
  8859.  
  8860.  
  8861.  
  8862. R-21: SOUND MUSIC & SPEECH COMMANDS
  8863.  
  8864. Sound objects are used to store audio information.  This information can  be
  8865. taken  from an 8SVX IFF file using LoadSound,  or defined by hand through  a
  8866. BASIC  routine using InitSound and SoundData.  Once a sound is created,   it
  8867. may be played through the Amiga's audio hardware.
  8868.  
  8869. Blitz supports loading and playing of both soundtracker and medmodule  music
  8870. files.
  8871.  
  8872. The  Amiga  speech  synthesiser   is   also   accessible  from  Blitz.   The
  8873. narrator.device  has  been upgraded in 2.0 increasing  the  quality  of  the
  8874. speech.   With a bit of messing around you can have a lot of  fun  with  the
  8875. Amiga's 'voice'.
  8876.  
  8877. LoadSound Sound#,Filename$
  8878.  
  8879. LoadSound creates a sound object for later playback. The sound is taken from
  8880. an  8SVX IFF file.  An error will be generated if the specified file is  not
  8881. in the correct IFF format.
  8882.  
  8883. Sound Sound#,Channe/mask[, Vo/1[, Vo/2...p
  8884.  
  8885. Sound  causes  a  previously created sound object to be played  through  the
  8886. Amiga's  audio  hardware.  Channelmask specifies which of the  Amiga's  four
  8887. audio  channels the sound should be played through,  and should  be  in  the
  8888. range one through fifteen.
  8889.  
  8890. The following is a list of Channelmask values and their effect:
  8891.  
  8892. Mask    Channe|O    Channe|1    Channel2    Channel3
  8893. 1    on            off            off            off
  8894. 2    off            on            off            off
  8895. 3    on            on            off            off
  8896. 4    off            off            on            off
  8897. 5    on            off            on            off
  8898. 6    off            on            on            off
  8899. 7    on            on            on            off
  8900. 8    off            off            off            on
  8901. 9    on            off            off            on
  8902. 10    off            on            off            on
  8903. 11    on            on            off            on
  8904. 12    off            off            on            on
  8905. 13    on            off            on            on
  8906. 14    off            on            on            on
  8907. 15    on            on            on            on
  8908.  
  8909. In the above table, any audio channels specified as 'off' are not altered by
  8910. Sound,   and any sounds they may have previously been playing  will  not  be
  8911. affected.
  8912.  
  8913. Page 168
  8914.  
  8915. The  Volx  parameters allow individual volume settings for  different  audio
  8916. channels.  Volume settings must be in the range zero through 64,  zero being
  8917. silence,  and 64 being loudest. The first Vol parameter specifies the volume
  8918. for  the  lowest numbered 'on' audio channel,  the second Vol for  the  next
  8919. lowest and so on.
  8920.  
  8921. For  example,   assume  you are using the following  Sound  command:   Sound
  8922. 0,10,32, 16
  8923.  
  8924. The Channelmask of ten means the sound will play through audio channels  one
  8925. and three.  The first volume of 32 will be applied to channel one,  and  the
  8926. second volume of 16 will be applied to channel three.
  8927.  
  8928. Any Vol parameters omitted will be cause a volume setting of 64.
  8929.  
  8930. LoopSound Sound#,Channelmask[, Vol1[, Vol2...D
  8931.  
  8932. LoopSound  behaves  identically to Sound,  only the  sound  will  be  played
  8933. repeatedly.   Looping a sound allows for the facility  to  play  the  entire
  8934. sound just once,  and begin repeating at a point in the sound other than the
  8935. beginning.   This  information is picked up from the 8SVX  IFF  file,   when
  8936. LoadSound  is  used  to create the sound,  or from the offset  parameter  of
  8937. InitSound.
  8938.  
  8939. Volume Channelmask, Vol1[, Vol2...]
  8940.  
  8941. Volume allows you to dynamically alter the volume of an audio channel.  This
  8942. enables effects such as volume fades.  For an explanation of Channelmask and
  8943. Vol parameters, please refer to the Sound command.
  8944.  
  8945. InitSound Sound#,LengthLPeriod[, Repeatil
  8946.  
  8947. InitSound  initializes a sound object in preparation  for  the  creation  of
  8948. custom  sound data.  This allows simple sound waves such as sine  or  square
  8949. waves to be algorithmically created.  SoundData should be used to create the
  8950. actual wave data.
  8951.  
  8952. Length refers to the length,  in bytes,  the sound object is required to be.
  8953. Length MUST be less than 1 28K, and MUST be even.
  8954.  
  8955. Period allows you to specify a default pitch for the sound.  A period of 428
  8956. will cause the sound to be played at approximately middle 'C'.
  8957.  
  8958. Otfset  is used in conjunction with LoopSound,  and specifies a position  in
  8959. the  sound  at which repeating should begin.  Please refer to LoopSound  for
  8960. more information on repeating sounds.
  8961.  
  8962. SoundData Sound#,Offset,Data
  8963.  
  8964. SoundData  allows you to manually specify the waveform of  a  sound  object.
  8965. The  sound  object  should  normally  have  been  created  using  InitSound,
  8966. although altering IFF sounds is perfectly legal.
  8967.  
  8968. SoundData  alters  one  byte of sound data at the  specified  Offset.   Data
  8969. refers  to the actual byte to place into the sound,  and should  be  in  the
  8970. range -128 to +127.
  8971.  
  8972. PeekSound (Sound#,Offset)
  8973.  
  8974. PeekSound returns the byte of a sample at the specified offset of the  sound
  8975. object specified.
  8976.  
  8977. Page 169
  8978.  
  8979. DecodeSound Sound#,MemoryLocation
  8980.  
  8981. DecodeSound,  similar to the other new Decode commands allows the programmer
  8982. to include sound files within their program's object code.
  8983.  
  8984. SetPeriod Sound#,Period
  8985.  
  8986. This  command  allows the programmer to manually adjust the  period  of  the
  8987. sound object to change it's effective pitch.
  8988.  
  8989. DiskPlay Filename$, Channelmask[, Vol1[, Vol2...p
  8990.  
  8991. DiskPlay will play an 8SVX IFF sound file straight from disk.  This is ideal
  8992. for  situations  where you simply want to play a sample  without  the  extra
  8993. hassle  of loading a sound,  playing it,  and then freeing it.  The DiskPlay
  8994. command will also halt program flow until the sample has finished playing.
  8995.  
  8996. DiskPlay  usually  requires much less memory  to  play  a  sample  than  the
  8997. LoadSound,  Sound technique.  Also,  DiskPlay allows you to play samples  of
  8998. any  length,  whereas LoadSound only allows samples up to 128K in length  to
  8999. be loaded.
  9000.  
  9001. DiskBuffer Bufferlen
  9002.  
  9003. DiskBuffer  allows  you to set the size of the memory  buffer  used  by  the
  9004. DiskPlay command.  This Buffer is by default set to 1024 bytes,  and  should
  9005. not normally have to be set to more than this.
  9006.  
  9007. Reducing the buffer size by too much may cause loss of sound quality of  the
  9008. DiskPlay command.
  9009.  
  9010. If you are using DiskPlay to access a very slow device,  the buffer size may
  9011. have to be increased.
  9012.  
  9013. Filter Onl Off
  9014.  
  9015. Filter may be used to turn on or off the Amiga's low pass audio filter.
  9016.  
  9017. LoadModule Module#,Filename$
  9018.  
  9019. LoadModule  loads  in  from disk a soundtracker/noisetracker  music  module.
  9020. This module may be later played back using PlayModule.
  9021.  
  9022. Free Module Module#
  9023.  
  9024. Free  Module may be used to delete a module object.  Any memory occupied  by
  9025. the module will also be free'd.
  9026.  
  9027. PlayModule Module#
  9028.  
  9029. PlayModule  will  cause  a previously loaded soundtracker/noisetracker  song
  9030. module to be played back.
  9031.  
  9032. StopModule
  9033.  
  9034. StopModule will cause any soundtracker/noisetracker modules which may be
  9035.  
  9036. Page 170
  9037.  
  9038.  
  9039.  
  9040. currently playing to stop.
  9041.  
  9042. Load Med Mod u le MedModule# Name
  9043.  
  9044. The  LoadMedModule command loads any version 4 channel Octamed module.   The
  9045. following  routines support upto and including version 3 of  the  Amiganut's
  9046. Med standard.
  9047.  
  9048. The  number  of MedModules loaded in memory at one time is only  limited  by
  9049. the  MedModules maximum set in the Blitz Options requester.  Like any  Blitz
  9050. commands that access files LoadMedModule can only be used in AmigaMode.
  9051.  
  9052. StartMedModule MedModule#
  9053.  
  9054. StartMedModule is responsible for initialising the module including  linking
  9055. after  it is loaded from disk using the LoadMedModule command.  It can  also
  9056. be used to restart a module from the beginning.
  9057.  
  9058. PlayMed
  9059.  
  9060. PlayMed is responsible for playing the current MedModule,  it must be called
  9061. every  50th of a second either on an interupt (#5)  or after a  VWait  in  a
  9062. program loop.
  9063.  
  9064. StopMed
  9065.  
  9066. StopMed will cause any med module to stop playing.  This not only means that
  9067. PlayMed  will have no affect until the next StartMedModule but silences  the
  9068. audio  channels so they are not left ringing as is the effect  when  PlayMed
  9069. is not called every vertical blank.
  9070.  
  9071. JumpMed Pattern#
  9072.  
  9073. JumpMed will change the pattern being played in the current module.
  9074.  
  9075. SetMedVolume Volume
  9076.  
  9077. SetMedVolume  changes  the overall volume that the  Med  Library  plays  the
  9078. module,  all the audio channels are affected. This is most useful for fading
  9079. out music by slowly decreasing the volume from 64 to 0.
  9080.  
  9081. GetMedVolume Channel#
  9082.  
  9083. GetMedVolume  returns  the current volume setting  of  the  specified  audio
  9084. channel.  This is useful for graphic effects that you may wish  to  sync  to
  9085. certain channels of the music playing.
  9086.  
  9087. GetMedNote Channel#
  9088.  
  9089. GetMedNote returns the current note playing from the specified channel.   As
  9090. with  GetMedVolume this is useful for producing graphics effects  synced  to
  9091. the music the Med Library is playing.
  9092.  
  9093. Page 171
  9094.  
  9095. GetMedinstr Channel
  9096.  
  9097. GetMedInstr  returns  the current instrument playing through  the  specified
  9098. audio channel.
  9099.  
  9100. SetMedMask Channel Mask
  9101.  
  9102. SetMedMask  allows  the  user to mask out audio  channels  needed  by  sound
  9103. effects stopping the Med Library using them.
  9104.  
  9105. DecodeMedModule MedModule#,MemoryLocation
  9106.  
  9107. DecodeMedModule replaces the cludgemedmodule,  as med modules are not packed
  9108. but  used  raw,   DecodeMedModule simply checks to see the  memory  location
  9109. passed  is  in ChipMem (if not it copies the data to chip)  and  points  the
  9110. Blitz MedModule object to that memory.
  9111.  
  9112. . Speak string$
  9113.  
  9114. The  Speak command will first convert the given string to phonetics and then
  9115. pass  it  to the Narrator.Device.  Depending on the settings of the Narrator
  9116. device (see SetVoice) the Amiga will "speak" the string you have sent in the
  9117. familiar Amiga synthetic voice.
  9118.  
  9119. SetVoice rate,pitch,expression,sex, volume,frequency
  9120.  
  9121. SetVoice  alters the sound of the Amiga's speech synthsiser by changing  the
  9122. vocal characteristics listed in the parameters above.
  9123.  
  9124. Translate$ (string$)
  9125.  
  9126. Translate$()  returns the phonetic equivalent of the string for use with the
  9127. PhoneticSpeak command.
  9128.  
  9129. PhoneticSpeak phonetic$
  9130.  
  9131. PhoneticSpeak  is  similar to the Speak command but should  only  be  passed
  9132. strings  containing legal phonemes such as that produced by the Translate$()
  9133. function.
  9134.  
  9135. VoiceLoc
  9136.  
  9137. VoiceLoc  returns  a  pointer  to  the  internal  variables  in  the  speech
  9138. synthesiser that enable the user to access new parameters added to  the  V37
  9139. Narrator Device.  Formants as referred to in the descriptions are the  major
  9140. vocal  tracts  and are separated into the parts of speech that  produce  the
  9141. bass, medium and trebly sounds.
  9142.  
  9143. Page 172
  9144.  
  9145.  
  9146.  
  9147. R-22: SCREEN COMMANDS
  9148.  
  9149. The  following  section covers the Blitz commands  that  let  you  open  and
  9150. control Intuition based Screen objects.
  9151.  
  9152. Command Description
  9153.  
  9154. Screen  Screen#,Mode[,   TiUe$] Screen#,X,  Y,  Width,Height,Depth,   VMode,
  9155. Title$,Dpen,Bpen[BMap#]
  9156.  
  9157. Screen  will  open  an Intuition screen.  The are 2 formats  of  the  screen
  9158. command, a quick format, and a long format.
  9159.  
  9160. The  quick  format of the Screen commands involves 3 parameters  -  Screen#,
  9161. Mode and an optional Title$.
  9162.  
  9163. Screen# specifies the screen object to create.
  9164.  
  9165. Mode specifies how many bitplanes the screen is to have,  and should  be  in
  9166. the  range I through 6.  Adding 8 to Mode will cause a hi-res screen  to  be
  9167. opened,  as opposed to the default lo-res screen.  A hi-res screen may  only
  9168. have  from  I  to  4 bitplanes.  Adding 16 to Mode will cause an  interlaced
  9169. screen to be opened. 'lPitle$ allows you to add a title to the screen.
  9170.  
  9171. The  long  format of Screen gives you much more control over how the  screen
  9172. is opened.
  9173.  
  9174. The  VMode parameter refers to the resolution of the Screen,  add the values
  9175. together to make up the screenmode you require:
  9176.  
  9177. hires=$8000
  9178. ham=$200
  9179.  
  9180. superhires=$20
  9181. interlace=4
  9182.  
  9183. lores=0
  9184.  
  9185. ShowScreen Screen#
  9186.  
  9187. ShowScreen will cause the specified screen object to be moved to  the  front
  9188. of the display.
  9189.  
  9190. WbToScreen Screen#
  9191.  
  9192. WbToScreen  will assign the Workbench screen a screen object  number.   This
  9193. allows  you to perform any of the functions that you would normally  do  own
  9194. your own screens,  on the Workbench screen.  It's main usage is to allow you
  9195. to open windows on the Workbench screen.
  9196.  
  9197. After execution, the Workbench screen will become the currently used screen.
  9198. FindScreen Screen#[, Title$]
  9199.  
  9200. This  command will find a screen and give it an object number so it  can  be
  9201. referenced in your programs.  If Title$ is not specified,  then the foremost
  9202. screen is found and given the object number Screen#.  If the Title$ argument
  9203. is specified, then a screen will be searched for that has this name.
  9204.  
  9205. After  execution,  the found screen will automatically become the  currently
  9206. used screen.
  9207.  
  9208. Page 173
  9209.  
  9210. LoadSc reen Screen#, Fi lename$[, Palette#]
  9211.  
  9212. LoadScreen  loads  an IFF ILBM picture into the screen object  specified  by
  9213. Screen#. The file that is loaded is specified by Filename$.
  9214.  
  9215. You  can  also  choose to load in the colour palette  for  the  screen,   by
  9216. specifying  the optional Palette#.  This value is the object number  of  the
  9217. palette you want the pictures colours to be loaded into.  For the colours to
  9218. be used on your screen, you will have to use the statement.
  9219.  
  9220. SaveScreen Screen#,Filename$
  9221.  
  9222. SaveScreen will save a screen to disk as an IFF ILBM file.  The  screen  you
  9223. wish  to save is specified by the Screen#,  and the name of the file you  to
  9224. create is specified by Filename$.
  9225.  
  9226. SMouseX
  9227.  
  9228. SMouseX  returns the horizontal position of the mouse relative to  the  left
  9229. edge of the currently used screen.
  9230.  
  9231. SMouseY
  9232.  
  9233. SMouseY  returns the vertical position of the mouse relative to the  top  of
  9234. the current screen.
  9235.  
  9236. ViewPort (Screen#)
  9237.  
  9238. The  ViewPort  function  returns  the  location  of  the  specified  screens
  9239. ViewPort.   The ViewPort address can be used with graphics.library  commands
  9240. and the like.
  9241.  
  9242. ScreenPens active text,  inactive text,  hilight, shadow, acUve fill, gadget
  9243. fill
  9244.  
  9245. ScreenPens  configures  the  10 default pens  used  for  system  gadgets  in
  9246. WorkBench 2.0.  Any Screens opened after a ScreenPens statement will use the
  9247. pens defined.  This command will have no affect when used with Workbench 1.3
  9248. or earlier.
  9249.  
  9250. CloseScreen Screen#
  9251.  
  9252. CloseScreen has been added for convenience. Same as Free Screen but a little
  9253. more intuitive (especially for those that have complained about such matters
  9254. (yes we care)).
  9255.  
  9256. HideScreen Screen#
  9257.  
  9258. Move Screen to back of all Screens open in the system.
  9259.  
  9260. BeepScreen Screen#
  9261.  
  9262. Flash specified screen.
  9263.  
  9264. Page 174
  9265.  
  9266. MoveScreen Screen#,deltax,deltay
  9267.  
  9268. Move specified screen by specified amount.  Good for system friendly special
  9269. effects.
  9270.  
  9271. ScreenTags Screen#,Title$[&TagList]or[[,Tag,Data]...]
  9272.  
  9273. Full  access  to all the Amiga's new display resoutions is now available  in
  9274. Amiga  mode by use of the Screen Tags command.  The following  tags  are  of
  9275. most interest to Blitz programmers.
  9276.  
  9277. #Left=$ 80000021 :#Top=$80000022 :#Width=$80000023
  9278. #Height=$80000024:#Depth=$80000025:#DetailPen=$80000026
  9279. #BlockPen=$80000027
  9280. #Title=$80000028 :#Colors=$80000029 :#ErrorCode=$8000002A
  9281. #Font=$8000002B :#SysFont=$8000002C:#Type=$8000002D
  9282. #BitMap=$8000002E
  9283. #PubName=$8000002F:#PubSig=$80000030
  9284. #PubTask=$80000031 :#DisplayID=$80000032
  9285. #DClip=$80000033:#0verscan=$80000034
  9286. #S howTitle=$ 80000036:#Behi nd=$80000037 :#_Qu iet=$80000038
  9287. #AutoScroll=$80000039:#Pens=$8000003A
  9288. #FullPalette=$8000003B:#ColorMapEntries=$8000003C
  9289. #Parent=$8000003D :#Draggable=$8000003E
  9290. #Exclusive=$8000003F
  9291. #SharePens=$80000040:#BackFill=$80000041
  9292. #_Interleaved=$80000042
  9293. #Colors32=$80000043 :#VideoControl=$80000044
  9294. #FrontChild=$80000045 :#BackChild=$80000046
  9295. #LikeWorkbench=$80000047:#Reserved=$80000048
  9296.  
  9297. ShowBitMap [BitMap#]
  9298.  
  9299. The  ShowBitMap command is the Amiga-mode version of the Show  command.   It
  9300. enables  you  to  change a Screens bitmap allowing double buffered  (flicker
  9301. free)  animation to happen on a standard Intuition Screen. Unlike Blitz mode
  9302. it  is  better  to  do  ShowBitMap then VWait to sync up  with  the  Amiga's
  9303. display,   this  will  make sure the new bitmap is  being  displayed  before
  9304. modifying the previous BitMap.
  9305.  
  9306. Page 175
  9307.  
  9308. R-23: WINDOW COMMANDS
  9309.  
  9310. Windows are the heart of the user friendly Amiga operating system.  Not only
  9311. are  they the graphics device used for both user input and display  but  are
  9312. the  heart  of  the messaging system that communicates this  information  to
  9313. your program by way of the events system.
  9314.  
  9315. Typically a Blitz program will either open or find a screen to use,   define
  9316. a  list of gadgets and then open a window on the screen with the gadget list
  9317. attached.  It will then wait for an event such as the user selecting a  menu
  9318. or hitting a gadget and act accordingly.
  9319.  
  9320. The  program can specify which events they wish to receive by modifying  the
  9321. IDCMP  flags  for the window.  Once an event is received Blitz  has  a  wide
  9322. range of commands for finding out exactly what the user has gone and done.
  9323.  
  9324. Blitz also offers a number of drawing commands that allow the programmer  to
  9325. render graphics to the currently used window.
  9326.  
  9327. Command Description
  9328.  
  9329. Window  Window#,X,   Y,   Width,  Heigh t,  Flags,  Title$,   Dpen,   Spen[,
  9330. GadgetList#]
  9331.  
  9332. Window opens an Intuition window on the currently used screen.  Window# is a
  9333. unique  object number for the new window.  X and Y refer to the offset  from
  9334. the top left of the screen the window is to appear at.  Width and Height are
  9335. the size of the window in pixels.
  9336.  
  9337. Flags  are  the  special window flags that a window can  have  when  opened.
  9338. These  flags allow for the inclusion of a sizing gadget,  dragbar  and  many
  9339. other  things.  The flags are listed as followed,  with their  corresponding
  9340. values.  To select more than one of these flags, they must be logically Or'd
  9341. together using the'l ' operator.
  9342.  
  9343. For example, to open a window with dragbar and sizing gadget which is active
  9344. once opened, you would specify a Flags parameter of $11 $21 $1000.
  9345.  
  9346. Title$ is a BASIC string,  either a constant or a variable, that you want to
  9347. be the title of the window.
  9348.  
  9349. Dpen is the colour of the detail pen of the window.  This colour is used for
  9350. the window title.
  9351.  
  9352. BPen  is the block pen of the window.  This pen is used for things like  the
  9353. border around the edge of the window.
  9354.  
  9355. The  optional GadgetList# is the number of a gadgetlist object you have  may
  9356. want attached to the window.
  9357.  
  9358. After the window has opened, it will become the currently used window.
  9359.  
  9360. The  Window  library  has  been  extended to handle  super  bitmap  windows.
  9361. SuperBitMap  windows  allow the window to have it's  own  bitmap  which  can
  9362. actually  be larger than the window.  The two main benefits of this  feature
  9363. are  the window's ability to refresh itself and the ability to scroll around
  9364. a large area "inside" the bitmap.
  9365.  
  9366. To  attach a BitMap to a Window set the SuperBitMap flag in the flags  field
  9367. and include the BitMap# to be attached.
  9368.  
  9369. Page 176
  9370.  
  9371.  
  9372.  
  9373. Window Flag    Value        Description
  9374.  
  9375. WINDOWSIZING    $0001    Attaches sizing gadget to bottom right corner
  9376.             of window and allows it to be sized.
  9377. WINDOWDRAG    $0002    Allows window to be dragged with the
  9378.             mouse by it's title bar.
  9379. WINDOWDEPTH    $0004    Lets windows be pushed behind or pulled in
  9380.             front of other windows.
  9381. WINDOWCLOSE    $0008    Attaches a closegadget to the upper left
  9382.             corner of the window.
  9383. SIZEBRIGHT    $0010    With GIMMEZEROZERO and
  9384.             WINDOWSIZING set, this will leave the
  9385.             right hand margin, the width of the sizing
  9386.             gadget, clear, and any drawing to the
  9387.             window will not extend over this right
  9388.             margm.
  9389. SIZEBBOTTOM    $0020    Same as SIZEBRIGHT except it leaves a
  9390.             margin at the bottom of the window, the
  9391.             width of the sizing gadget.
  9392. BACKDROP    $0100    This opens the window behind any other
  9393.             window that is already opened. It cannot
  9394.             have the WINDOWDEPTH flag set also, as
  9395.             the window is intended to stay behind all
  9396.             others.
  9397. GIMME00        $0400    This flag keeps the windows border separate
  9398.             from the rest of the windows area. Any
  9399.             drawing on the window, extending to the
  9400.             borders, will not overwrite the border.
  9401.             NOTE: Although convevient, this does take
  9402.             up more memory than usual.
  9403. BORDERLESS    $0800    Opens a window without any border on it at
  9404.             all.
  9405. ACTIVATE    $1000    Activates the window once opened.
  9406.  
  9407.  
  9408. Use Window Window#
  9409.  
  9410. Use  Window  will cause the specified window object to become the  currently
  9411. used  window.   Use  Window also automatically performs  a  WindowInput  and
  9412. WindowOutput on the specified window.
  9413.  
  9414. Free Window Window#
  9415.  
  9416. Free Window closes down a window.  This window is now gone,  and can not  be
  9417. accessed any more by any statements or functions.  Once a window is  closed,
  9418. you  may want to direct the input and output somewhere new,  by calling  Use
  9419. Window  on  another window,  DefaultOutput/DefaultInput,  or by  some  other
  9420. appropriate means. Window# is the window object number to close.
  9421.  
  9422. Page 177
  9423.  
  9424. Windowinput Window#
  9425.  
  9426. Windowinput will cause any future executions of the Inkey$,  Edit$  or  Edit
  9427. functions  to  receive their input as keystrokes from the  specified  window
  9428. object.
  9429.  
  9430. WindowInput  is automatically executed when either a window is  opened,   or
  9431. Use Window is executed.
  9432.  
  9433. After a window is closed (using Free Window),  remember to tell Blitz to get
  9434. it's  input  from  somewhere  else   useful  (for  example,   using  another
  9435. WindowInput  command)   before executing  another  Inkey$,   Edit$  or  Edit
  9436. function.
  9437.  
  9438. WindowOutput Window#
  9439.  
  9440. WindowOutput will cause any future executions of either the Print or  NPrint
  9441. statements to send their output as text to the specified window object.
  9442.  
  9443. WindowOutput is automatically executed when either a window is  opened,   or
  9444. Use Window is executed.
  9445.  
  9446. After  a  window  is closed (using Free Window),  remember  to  send  output
  9447. somewhere  else  useful  (for example,  using another WindowOutput  command)
  9448. before executing another Print or NPrint statement.
  9449.  
  9450. DefaultlDCMP IDCMP_Flags
  9451.  
  9452. DefaultIDCMP  allows you to set the IDCMP flags used  when  opening  further
  9453. windows.  You can change the flags as often as you like, causing all of your
  9454. windows to have their own set of IDCMP flags if you wish.
  9455.  
  9456. A  window's IDCMP flags will affect the types of 'events' reportable by  the
  9457. window. Events are reported to a program by means of either the WaitEvent or
  9458. Event functions.
  9459.  
  9460. To  select  more than one IDCMP Flag when using DefaultIDCMP,   combine  the
  9461. separate flags together using the OR operator ('I ').
  9462.  
  9463. Any  windows  opened before any DefaultIDCMP command  is  executed  will  be
  9464. opened using an IDCMP flags setting of:
  9465.  
  9466. $21 $41 $81 $201 $401 $1001 $2001 $4001 $400001 $80000.
  9467.  
  9468. This should be sufficient for most programs.
  9469.  
  9470. If you do use DefaultIDCMP for some reason,  it is important to remember  to
  9471. include  all  flags  necessary  for the functioning  of  the  program.   For
  9472. example,  if you open a window which is to have menus attached to  it,   you
  9473. MUST set the $100 (menu selected)  IDCMP flag,  or else you will have no way
  9474. of telling when a menu has been selected.
  9475.  
  9476. Page 178
  9477.  
  9478.     IDCMP    FlagEvent
  9479.     $2    Reported when a window has it's size changed.
  9480.     $4    Reported when a windows contents have been
  9481.         corrupted. This may mean a windows contents may
  9482.         need to be re-drawn.
  9483.     $8    Reported when either mouse button has been hit.
  9484.     $10    Reported when the mouse has been moved.
  9485.     $20    Reported when a gadget within a window has been
  9486.         pushed 'down'.
  9487.     $40    Reported when a gadget within a window has been
  9488.         'released'.
  9489.     $100    Reported when a menu operation within a window has
  9490.         occured.
  9491.     $200    Reported when the 'close' gadget of a window has
  9492.         been selected.
  9493.     $400    Reported when a keypress has been detected.
  9494.     $8000    Reported when a disk is inserted into a disk drive.
  9495.     $10000    Reported when a disk is removed from a disk drive.
  9496.     $40000    Reported when a window has been 'activated'.
  9497.     $80000    Reported when a window has been 'de-activated'.
  9498.  
  9499. AddlDCMP IDCMP_Flags
  9500.  
  9501. AddIDCMP  allows you to 'add in' IDCMP flags to the IDCMP flags selected  by
  9502. DefaultIDCMP.   Please refer to DefaultIDCMP for a  thorough  discussion  of
  9503. IDCMP flags.
  9504.  
  9505. SublDCMP IDCMP_Flags
  9506.  
  9507. SubIDCMP  allows  you to 'subtract out' IDCMP flags  from  the  IDCMP  flags
  9508. selected  by  DefaultIDCMP.  Please refer to  DefaultIDCMP  for  a  thorough
  9509. discussion of IDCMP flags.
  9510.  
  9511. WaitEvent
  9512.  
  9513. WaitEvent  will  halt  program excution until an Intuition  event  has  been
  9514. received.  This event must be one that satisfies the IDCMP flags of any open
  9515. windows.  If used as a function,  WaitEvent returns the IDCMP  flag  of  the
  9516. event (please refer to DefaultIDCMP for a table of possible IDCMP flags). If
  9517. used as a statement, you have no way of telling what event occured.
  9518.  
  9519. You  may  find  the  window object number that caused the  event  using  the
  9520. EventWindow function.
  9521.  
  9522. In  the  case of events concerning gadgets or menus,  further functions  are
  9523. available to detect which gadget or menu was played with.
  9524.  
  9525. In  the  case of mouse button events,  the MButtons function may be used  to
  9526. discover exactly which mouse button has been hit.
  9527.  
  9528. IMPORTANT NOTE:  If you are assigning the result of WaitEvent to a variable,
  9529. MAKE SURE that the variable is a long type variable.
  9530.  
  9531. Page 179
  9532.  
  9533.  
  9534.  
  9535. For example: MyEvent.l=WaitEvent
  9536.  
  9537. Event
  9538.  
  9539. Event works similarly to WaitEvent in that it returns the IDCMP flag of  any
  9540. outstanding windows events.  However,  Event will NOT cause program flow  to
  9541. halt. Instead, if no event has occured, Event will return 0.
  9542.  
  9543. EventWindow
  9544.  
  9545. EventWindow may be used to determine in which window the most recent  window
  9546. event occured.  Window events are detected by use of either the WaitEvent or
  9547. Event commands.
  9548.  
  9549. EventWindow  returns  the window object number  in  which  the  most  recent
  9550. window event occured
  9551.  
  9552. Flush Events [IDCMP_Flag]
  9553.  
  9554. When window events occur in Blitz,  they are automatically 'queued' for you.
  9555. This means that if your program is tied up processing one window event while
  9556. others are being created,  you wont miss out on anything.  Any events  which
  9557. may have occured between executions of WaitEvent or Event will be stored  in
  9558. a  queue for later use.  However,  there may be situations where you want to
  9559. ignore this backlog of events. This is what FlushEvents is for.
  9560.  
  9561. Executing  FlushEvents  with  no parameters will  completely  clear  Blitz's
  9562. internal event queue,  leaving you with no outstanding events.  Supplying an
  9563. IDCMP_Flag parameter will only clear events of the specified type  from  the
  9564. event queue.
  9565.  
  9566. GadgetHit
  9567.  
  9568. GadgetHit  returns the identification number of the gadget that  caused  the
  9569. most recent 'gadget pushed' or 'gadget released' event.
  9570.  
  9571. As  gadgets in different windows may possibly posess the same identification
  9572. numbers,  you may also need to use EventWindow to tell exactly which  gadget
  9573. was hit.
  9574.  
  9575. MenuHit
  9576.  
  9577. MenuHit returns the identification number of the menu that caused  the  last
  9578. menu  event.   As with gadgets,  you can have different menus for  different
  9579. windows with the same identification number.  Therefore you may also need to
  9580. use EventWindow to find which window caused the event.  If no menus have yet
  9581. been selected, Menuhit will return - l.
  9582.  
  9583. ItemHit
  9584.  
  9585. ItemHit  returns the identification number of the menu item that caused  the
  9586. last menu event.
  9587.  
  9588. SubHit
  9589.  
  9590. SubHit returns the identification number of the the menu subitem that caused
  9591. the last menu event. If no subitem was selected, SubHit will return -l.
  9592.  
  9593. Page 180
  9594.  
  9595. MButtons
  9596.  
  9597. MButtons returns the codes for the mouse buttons that caused the most recent
  9598. 'mouse buttons' event.  If menus have been turned off using Menus Off,  then
  9599. the  right  mouse button will also register an event and can  be  read  with
  9600. MButtons.
  9601.  
  9602. RawKey
  9603.  
  9604. RawKey  returns the raw key code of a key that caused the most  recent  'key
  9605. press' evens.
  9606.  
  9607. Qualifier
  9608.  
  9609. Qualifier  will  return  the qualifier of the last  key  that  caused  a'key
  9610. press'  event  to occur.  A qualifier is a key which alters the  meaning  of
  9611. other  keys;   for example the 'shift' keys.  Here is a table  of  qualifier
  9612. values and their equivalent keys:
  9613.  
  9614. Key            Left.            Right
  9615.  
  9616. UnQualified        $8000            $8000
  9617. Shift            $8001            $8002
  9618. Caps Lock Down        $8004            $8004
  9619. Control            $8008            $8008
  9620. Alternate        $8010            $8020
  9621. Amiga            $8040            $8080
  9622.  
  9623. A  combination of values may occur,  if more that one qualifier key is being
  9624. held  down.  The way to filter out the qualifiers that you want is by  using
  9625. the logical AND operator.
  9626.  
  9627. WPlot X, Y,Colour
  9628.  
  9629. WPlot plots a pixel in the currently used window at the coordinates  X,Y  in
  9630. the colour specified by Colour.
  9631.  
  9632. WBox X1, Y1,X2, Y2,Colour
  9633.  
  9634. WBox  draws a solid rectangle in the currently used window.  The upper  left
  9635. hand coordinates of the box are specified with the Xl and Yl values, and the
  9636. bottom right hand corner of the box is specified by the values X2 and Y2.
  9637.  
  9638. WCircle X,Y,Radius,Colour
  9639.  
  9640. WCircle  allows  you  to draw a circle in the currently  used  window.   You
  9641. specify the centre of the circle with the coordinates X,Y.  The Radius value
  9642. specifies the radius of the circle you want to draw.  The last value, Colour
  9643. specifies what colour the circle will be drawn in.
  9644.  
  9645. Page 181
  9646.  
  9647. WEllipse X, Y,X Radius, Y Radius,Colour
  9648.  
  9649. WEllipse  draws  an ellipse in the currently used window.  You  specify  the
  9650. centre  of  the  ellipse with the coordinates X,Y.  X Radius  specifies  the
  9651. horizontal radius of the ellipse, Y Radius the vertical radius.
  9652.  
  9653. Colour refers to the colour in which to draw the ellipse.
  9654.  
  9655. WLine X1, Y1,X2, Y2[,Xn, Yn..],Colour
  9656.  
  9657. Wline allows you to draw a line or a series of lines into the currently used
  9658. window. The first two sets of coordinates Xl,Yl,X2,Y2, specify the start and
  9659. end  points  of  the  initial line.  Any coordinates specified  after  these
  9660. initial two,  will be the end points of another line going from the last set
  9661. of end points,  to this set. Colour is the colour of the line(s) that are to
  9662. be drawn.
  9663.  
  9664. WCls [Colour]
  9665.  
  9666. WCls  will  clear the currently used window to colour O,   or  a  colour  is
  9667. specified,   then it will be cleared to this colour.  If the current  window
  9668. was  not  opened with the GIMMEZEROZERO flag set,  then this statement  will
  9669. clear  any  border or title bar that the window has.  The InnerCls statement
  9670. should be used to avoid these side effects..
  9671.  
  9672. InnerCls [Colour]
  9673.  
  9674. InnerCls will clear only the inner portion of the currently used window.  It
  9675. will  not clear the titlebar or borders as WCls would do if your window  was
  9676. not opened with the GIMMEZEROZERO flag set.  If a colour is specified,  then
  9677. that colour will be used to clear the window.
  9678.  
  9679. WScroll X1, Y1,X2, Y2,Delta X,Delta Y
  9680.  
  9681. WScroll  will cause a rectangular area of the currently used  window  to  be
  9682. moved  or  'scrolled'.   Xl and.YI specify the  top  left  location  of  the
  9683. rectangle,  X2 and Y2 the bottom right.  The Delta parameters determine  how
  9684. far  to  move  the  area.  Positive values move the area right/down,   while
  9685. negative values move the area left/up.
  9686.  
  9687. Cursor Thickness
  9688.  
  9689. Cursor  will  set the style of cursor that appears when editing  strings  or
  9690. numbers with the Edit$ or Edit functions.  If Thickness is less than 0, then
  9691. a  block cursor will be used.  If the Thickness is greater then 0,  then  an
  9692. underline Thickness pixels high will be used.
  9693.  
  9694. Editat
  9695.  
  9696. After  executing an Edit$ or Edit function,  Editat may be used to determine
  9697. the  horizontal  character position of the cursor at the time  the  function
  9698. was exited.
  9699.  
  9700. Through the use of Editat,  EditExit, EditFrom and Edit$, simple full screen
  9701. editors may be put together.
  9702.  
  9703. Page 182
  9704.  
  9705. EditFrom [Characterpos]
  9706.  
  9707. EditFrom allows you to control how the Edit$ and Edit functions operate when
  9708. used within windows.
  9709.  
  9710. If  a  Characterpos  parameter is specified,  then the  next  time  an  edit
  9711. function  is  executed,   editing will commence at the  specified  character
  9712. position (0 being the first character position).
  9713.  
  9714. Also, editing may be terminated not just by the use of the 'return' key, but
  9715. also by any non printable character (for example,  'up arrow' or 'Esc') or a
  9716. window event. When used in conjunction with Editat and EditExit, this allows
  9717. you to put together simple full screen editors.
  9718.  
  9719. If Characterpos is omitted, Edit$ and Edit return to normal - editing always
  9720. beginning at character postition 0, and 'return' being the only way to exit.
  9721. EditExit
  9722.  
  9723. EditExit returns the ASCII value of the character that was used  to  exit  a
  9724. window  based Edit$ or Edit function.  You can only exit the edit  functions
  9725. with  keypresses other than 'return' if EditFrom has been executed prior  to
  9726. the edit call.
  9727.  
  9728. WindowFont IntuiFont#
  9729.  
  9730. WindowFont sets the font for the currently used window. Any further printing
  9731. to  this  window  will  be  in the specified font.  IntuiFont#  specifies  a
  9732. previously initialized intuifont object created using LoadFont.
  9733.  
  9734. WColour Foreground Colour[,Background Colour]
  9735.  
  9736. WColour  sets the foreground and background colour of printed text  for  the
  9737. currently used window.  Any further text printed on this window will  be  in
  9738. these colours.
  9739.  
  9740. WJam Jammode
  9741.  
  9742. WJam sets the text drawing mode of the currently used window.  These drawing
  9743. modes  allow you to do inverted,  complemented and other types of  graphics.
  9744. The drawing modes can be OR'ed together to create a combination of them.
  9745.  
  9746. Jaml=0
  9747.  
  9748. This draws only the foreground colour and leaves the background transparent.
  9749. Eg For the letter O, any empty space (inside and outside the letter) will be
  9750. transparent.
  9751.  
  9752. Jam2=1
  9753.  
  9754. This  draws both the foreground and background to the window.  Eg  With  the
  9755. letter  O  again,   the  O will be drawn,  but any clear  area  (inside  and
  9756. outside) will be drawn in the current background colour.
  9757.  
  9758. Complement=2
  9759.  
  9760. This will exlusive or (XOR) the bits of the graphics. Eg Drawing on the same
  9761. Page 183
  9762.  
  9763. place with the same graphics will cause the original display to return.
  9764.  
  9765. Inversvid =4
  9766.  
  9767. This allows the display of inverse video characters.  If used in conjunction
  9768. with Jam2,  it behaves like Jam2,  but the foreground and background colours
  9769. are exchanged.
  9770.  
  9771. Activate Window#
  9772.  
  9773. Activate will activate the window specified by Window#.
  9774.  
  9775. Menus OnlOff
  9776.  
  9777. The  Menus command may be used to turn ALL menus either on or off.   Turning
  9778. menus off may be useful if you wish to read the right mouse button.
  9779.  
  9780. WPointer Shape#
  9781.  
  9782. WPointer  allows  you to determine the mouse pointer  imagery  used  in  the
  9783. currently  used  window.  Shape# specifies an initialized shape  object  the
  9784. pointer  is to take it's appearance from,  and must be of 2 bitplanes  depth
  9785. (4 colours).
  9786.  
  9787. WMove X,Y
  9788.  
  9789. WMove will move the current window to screen position X,Y.
  9790.  
  9791. WSize Width,Height
  9792.  
  9793. WSize  will alter the width and height of the current window to  the  values
  9794. specified by Width and Height.
  9795.  
  9796. WMouseX
  9797.  
  9798. WMouseX  returns the horizontal x coordinate of the mouse  relative  to  the
  9799. left  edge of the current window.  If the current window was opened  without
  9800. the GIMMEZEROZERO flag set,  then the left edge is taken as the left edge of
  9801. the border around the window,  otherwise, if GIMMEZEROZERO was set, then the
  9802. left edge is the taken from inside the window border.
  9803.  
  9804. WMouseY
  9805.  
  9806. WMouseY returns the vertical y coordinate of the mouse relative to  the  top
  9807. of  the  current  window.   If the current window  was  opened  without  the
  9808. GIMMEZEROZERO  flag set,  then the top is taken as the  top  of  the  border
  9809. around the window,  otherwise,  if GIMMEZEROZERO was set,  then the  top  is
  9810. taken trom inside the window border.
  9811.  
  9812. EMouseX
  9813.  
  9814. EMouseX will return the horizontal position of the mouse pointer at the time
  9815. the most recent window event occured.  Window events are detected using  the
  9816. WaitEvent or Event commands.
  9817.  
  9818. Page 184
  9819.  
  9820. EMouseY
  9821.  
  9822. EMouseY will return the vertical position of the mouse pointer at  the  time
  9823. the most recent window event occured.  Window events are detected using  the
  9824. WaitEvent or Event commands.
  9825.  
  9826. WCursX
  9827.  
  9828. WCursX  returns the horizontal location of the text cursor of the  currently
  9829. used window. The text cursor position may be set using WLocate.
  9830.  
  9831. WCursY
  9832.  
  9833. WCursY  returns  the vertical location of the text cursor of  the  currently
  9834. used window. The text cursor position may be set using WLocate.
  9835.  
  9836. WLocate X, Y
  9837.  
  9838. WLocate  is  used to set the text cursor position within the currently  used
  9839. window.  X and Y are both specified in pixels as offsets from the  top  left
  9840. of  the  window.  Each window has it's own text cursor position,   therefore
  9841. changing  the text cursor position of one window will not affect  any  other
  9842. window's text cursor position.
  9843.  
  9844. WindowX
  9845.  
  9846. WindowX returns the horizontal pixel location of the top left corner of  the
  9847. currently used window, relative to the screen the window appears in.
  9848.  
  9849. WindowY
  9850.  
  9851. WindowY  returns the vertical pixel location of the top left corner  of  the
  9852. currently used window, relative to the screen the window appears in.
  9853.  
  9854. WindowWidth
  9855.  
  9856. WindowWidth returns the pixel width of the currently used window.
  9857.  
  9858. WindowHeight
  9859.  
  9860. WindowHeight returns the pixel height of the currently used window.
  9861.  
  9862. InnerWidth
  9863.  
  9864. InnerWidth  returns the pixel width of the area inside  the  border  of  the
  9865. currently used window.
  9866.  
  9867. InnerHeight
  9868.  
  9869. InnerHeight returns the pixel height of the area inside the  border  of  the
  9870. currently used window.
  9871.  
  9872. Page 185
  9873.  
  9874. WTopOff
  9875.  
  9876. WTopOff  returns the number of pixels between the top of the current  window
  9877. border and the inside of the window.
  9878.  
  9879. WLeftOff
  9880.  
  9881. WLeftOff  returns the number of pixels between the left edge of the  current
  9882. window border and the inside of the window.
  9883.  
  9884. SizeLimits Min Width,Min Height,Max Width,Max Height
  9885.  
  9886. SizeLimits  sets the limits that any new windows can be sized  to  with  the
  9887. sizing  gadget.   After calling this statement,  any new windows  will  have
  9888. these limits imposed on them.
  9889.  
  9890. RastPort (Window#)
  9891.  
  9892. RastPort returns the specified Window's RastPort address.  Many commands  in
  9893. the graphics.library and the like require a RastPort as a parameter.
  9894.  
  9895. PositionSuperBitMap x,y
  9896.  
  9897. PositionSuperBitMap is used to display a certain area of  the  bitmap  in  a
  9898. super bitmap window.
  9899.  
  9900. GetSuperBitMap
  9901.  
  9902. After  rendering  changes to a superbitmap window the  bitmap  attached  can
  9903. also  be  updated  with the GetSuperBitMap.  After rendering  changes  to  a
  9904. bitmap  the  superbitmap  window can be refreshed  with  the  PutSuperBitMap
  9905. command. Both commands work with the currently used window.
  9906.  
  9907. PutSuperBitMap
  9908.  
  9909. See GetSuperBitmap description.
  9910.  
  9911. WTitle windowtitle$,screentitle$
  9912.  
  9913. WTitle  is  used  to  alter both the current window's  title  bar  and  it's
  9914. screens  title bar.  Useful for displaying important stats such  as  program
  9915. status etc.
  9916.  
  9917. CloseWindow Window#
  9918.  
  9919. CloseWindow  has  been added for convenience.  Same as  Free  Window  but  a
  9920. little  more  intuitive  (added for those that have  complained  about  such
  9921. matters).
  9922.  
  9923. WPrintScroll
  9924.  
  9925. WPrintScroll will scroll the current window upwards if the  text  cursor  is
  9926. below the bottom of the window and adjust the cursor accordingly.  Presently
  9927. WPrintScroll  only  works with windows opened  with  the  gimmeO0  flag  set
  9928. (#gimmezerozero=$400).
  9929.  
  9930. Page 186
  9931.  
  9932. WBlit Shape#,x,y
  9933.  
  9934. WBlit can be used to blit any shape to the current window. Completely system
  9935. friendly  this  command will completely clip the shape  to  fit  inside  the
  9936. visible part of the window Use GimmeZeroZero windows for clean clipping when
  9937. the window has title/sizing gadgets.
  9938.  
  9939. BitMaptoWindow Bitmap#,Window#tsrox,srcy,destx,desty,wid,height]
  9940.  
  9941. BitMaptoWindow  will  copy  a  bitmap to a window  in  an  operating  system
  9942. friendly manner (what do you expect).  The main use of such a command is for
  9943. programs  which  use  the  raw bitmap commands  such  as  the  2D  and  Blit
  9944. libraries  for rendering bitmaps quickly but require a windowing environment
  9945. for the user inyerface.
  9946.  
  9947. EventCode
  9948.  
  9949. EventQualifier
  9950.  
  9951. EventCode  returns  the  actual code of the  last  Event  received  by  your
  9952. program,  EventQualifier returns the contents of the Qualifier field. Of use
  9953. with  the  new  GadTools  library and some other low  level  event  handling
  9954. requirements.
  9955.  
  9956. EventCode  returns  the  actual code of the  last  Event  received  by  your
  9957. program,  EventQualifier returns the contents of the Qualifier field. Of use
  9958. with  the  new  GadTools  library and some other low  level  event  handling
  9959. requirements.
  9960.  
  9961. WindowTags Window#,Flags, Title$,[&TagList]l [[Tag,Data]...]
  9962.  
  9963. Similar to ScreenTags,  WindowTags allows the advanced user to open a  Blitz
  9964. window  with  a  list of OS Tags as described in the documentation  for  the
  9965. operating system prior to 2.0.
  9966.  
  9967. LoadFont IntuiFont#,Fontname.font$, Y Size [,style]
  9968.  
  9969. LoadFont is used to load a font from the fonts: directory. Unlike BlitzFonts
  9970. any  size IntuiFont can be used.  The command WindowFont is used to set text
  9971. output to a certain IntuiFont in a particular Window.
  9972.  
  9973. The  LoadFont  command has been extended with an optional  style  parameter.
  9974. The following constants may be combined:
  9975.  
  9976. #underl ined= I
  9977.  
  9978. #bold=2 #italic=4 #extended=8 ;wider than normal #colour=64 ;hmm use  colour
  9979. version I suppose
  9980.  
  9981. Page 187
  9982.  
  9983. R-24: GADGET COMMANDS
  9984.  
  9985. Blitz  provides  extensive support for the creation  and  use  of  Intuition
  9986. gadgets.   This  is  done  through  the use  of  GadgetList  objects.   Each
  9987. gadgetlist  may contain one or more of the many types of available  gadgets,
  9988. and  may be attached to a window when that window is opened using the Window
  9989. command.
  9990.  
  9991. The  following  is  a table of the gadget flags and the gadget  types  which
  9992. they are relevant to:
  9993.  
  9994. Bit#     Meaning                 Text     String     Prop     Shape
  9995.  
  9996. 0    Toggle On/Off                yes        no        no        yes
  9997. I    Relative to Right Side of Window     yes        yes        yes        yes
  9998. 2    Relative to Bottom of Window         yes        yes        yes        yes
  9999. 3    Size Relative to Width of Window     no        no        yes        no
  10000. 4    Size Relative to Height of Window     no        no        yes        no
  10001. 0    Box Select                 yes        yes        yes        yes
  10002. 6    Prop Gadget has Horizontal Movement     no        no        yes        no
  10003. 7    Prop Gadget Has Vertical Movement     no        no        yes        no
  10004. 8    No Border around Prop Gadget         no        no        yes        no
  10005. 9    Mutually Exclusive             yes        yes        no        no
  10006. 10    Attach to Window's Right Border     yes        yes        yes        yes
  10007. 11    Attach to Window's Left Border         yes        yes        yes        yes
  10008. 12    Attach to Window's Top Border         yes        yes        yes        yes
  10009. 13    Attach to Window's Bottom Border     yes        yes        yes        yes
  10010. 14    Use GimmeZeroZero Border        yes        yes        yes        yes
  10011.  
  10012. Note:
  10013.  
  10014. If Relative Right is set the gadgets X should be negative,  as should it's Y
  10015. if  Relative to Bottom is set.  When relative Width or Height flags are  set
  10016. negative  Width  and/or Height parameters should be specified  as  Intuition
  10017. calculates  actual witdh as WindowWidth+GadgetWidth as it does  height  when
  10018. relative size flags are set.
  10019.  
  10020. Mutually exclusive radio button type gadgets DO NOT require WorkBench 2.0 to
  10021. operate, see ButtonGroup for more information.
  10022.  
  10023. The  attach  flags  are  for attaching the gadget  to  one  of  the  windows
  10024. borders,   the  GZZGADGET flag is for attaching the gadget  to  the  "outer"
  10025. rastport/ layer of a gimme zero zero window.
  10026.  
  10027. Here is an example of setting up some radio button style text gadgets:
  10028.  
  10029. TextGadget     0,16,16,512,1,"0PTION     l":Toggle     0,1,0n     TextGadget
  10030. 0,16,32,512,2,"OPTION 2" TextGadget 0,16,48,512,3,"0PTION 3"
  10031.  
  10032. Text  Gadgets  may now be used to create 'cycling' gadgets.   Again,   these
  10033. gadgets DO
  10034.  
  10035. Page 188
  10036.  
  10037. NOT require kickstart 2.0 to work.
  10038.  
  10039. If  you  create  a  text gadget which contains the 'l  '  character  in  the
  10040. gadget's text,  Blitz will recognize this as a 'cycling' gadget,  using  the
  10041. 'l ' character to separate the options - like this:
  10042.  
  10043. TextGadget 0, l 6, l 6,0, l ," HELLO l GOODBYEI SEEYA l "
  10044.  
  10045. Now,   each  time this gadget is clicked on,  the gadgets  text  will  cycle
  10046. through 'HELLO',  'GOODBYE' and 'SEEYA'. Note that each option is spaced out
  10047. to  be  of  equal length.  This feature should not be used with a  GadgetJam
  10048. mode of 0.
  10049.  
  10050. TextGadget GadgetList#,X, Y, F/ags, /d, Text$
  10051.  
  10052. The TextGadget command adds a text gadget to a gadgetlist.  A text gadget is
  10053. the  simplest  type  of  gadget  consisting  of  a  sequence  of  characters
  10054. optionally surrounded by a border.
  10055.  
  10056. Flags should be selected from the table at the start of the chapter.
  10057.  
  10058. Boolean gadgets are the simplest type of gadget available.  Boolean  gadgets
  10059. are 'off' until the program user clicks on them with the mouse,  which turns
  10060. them 'on'.  When the mouse button is released,  these gadgets revert back to
  10061. their 'off' state.  Boolean gadgets are most often used for 'Ok' or 'CANCEL'
  10062. type gadgets.
  10063.  
  10064. Toggle  gadgets  differ in that each time they are clicked  on  they  change
  10065. their  state  between 'on' and 'off'.  For example,  clicking  on  a  toggle
  10066. gadget  which  is 'on' will cause the gadget to be turned  'off,   and  vice
  10067. versa.
  10068.  
  10069. X and Y specify where in the window the gadget is to appear.  Depending upon
  10070. the Flags setting, gadgets may be positioned relative to any of the 4 window
  10071. edges.   If  a gadget is to be positioned relative to either  the  right  or
  10072. bottom  edge  of  a  window,  the appropriate X or  Y  parameter  should  be
  10073. negative.
  10074.  
  10075. Id is an identification value to be attached to this gadget.  All gadgets in
  10076. a  gadgetlist should have unique Id numbers,  allowing you to  detect  which
  10077. gadget has been selected. Id may be any positive, non-zero number.
  10078.  
  10079. Text$ is the actual text you want the gadget to contain.
  10080.  
  10081. ButtonGroup Group -
  10082.  
  10083. ButtonGroup  allows you to determine which 'group' a number of  button  type
  10084. gadgets  belong  to.   Following the execution of ButtonGroup,   any  button
  10085. gadgets created will be identified as belonging to the spiecified group. The
  10086. upshot  of  all this is that button gadgets are only mutually  exclusive  to
  10087. other button gadgets within the same group.
  10088.  
  10089. 'Group' must be a positive number greater than 0. Any button gadgets created
  10090. before a'ButtonGroup' command is executed will belong to group l.
  10091.  
  10092. SetGadgetStatus GadgetList#,/d,Va/ue
  10093.  
  10094. SetGadgetStatus is used to set a cycling text gadget to a particular  value,
  10095. once  set  ReDraw should be used to refresh the gadget to reflect  it's  new
  10096. value.
  10097.  
  10098. Page 189
  10099.  
  10100. GadgetPens Foreground Colour[,Background Colour]
  10101.  
  10102. GadgetPens  determines the text colours used when text gadgets  are  created
  10103. using  the  TextGadget command.  The default values used for gadget  colours
  10104. are a foreground colour of I, and a background colour of 0.
  10105.  
  10106. GadgetJam Jammode
  10107.  
  10108. GadgetJam  allows  you  to  determine the text rendering  method  used  when
  10109. gadgets are created using the TextGadget command.  Please refer to the  WJam
  10110. command  in  the  windows  chapter for  a  full  description  of  jam  modes
  10111. available.
  10112.  
  10113. SelectMode mode
  10114.  
  10115. SelectMode  is  used to predefine how gadget rendering will  show  a  gadget
  10116. .selection,  modes are I for box and O for inverse. Use prior to creation of
  10117. gadgets.
  10118.  
  10119. ShapeGadget GadgetList#,X,Y,Flags,ld,Shape#LShape;#]
  10120.  
  10121. The  ShapeGadget command allows you to create gadgets with graphic  imagery.
  10122. The  Shape#  parameter refers to a shape object containing the graphics  you
  10123. wish the gadget to contain.
  10124.  
  10125. The  ShapeGadget command has been extended to allow an alternative image  to
  10126. be displayed when the gadget is selected.
  10127.  
  10128. All other parameters are identical to those in TextGadget.
  10129.  
  10130. StringGadget GadgetList#,X, Y,Flags,ld,Maxlen, Width
  10131.  
  10132. StringGadget  allows you to create an Intuition style 'text  entry'  gadget.
  10133. When clicked on,  a string gadget brings up a text cursor,  and is ready  to
  10134. accept text entry trom the keyboard.
  10135.  
  10136. X  and Y specifies the gadgets,  position,  relative to the top left of  the
  10137. window  it  is  to  appear in.  See the beginning of  the  chapter  for  the
  10138. relevant Flags tor a string gadget.
  10139.  
  10140. Id is an identification value to be attached to this gadget.  All gadgets in
  10141. a  gadgetlist should have unique Id numbers,  allowing you to  detect  which
  10142. gadgets has been selected. Id may be any positive, non-zero number.
  10143.  
  10144. Maxlen refers to the maximum number of characters which may appear  in  this
  10145. gadgets.
  10146.  
  10147. Width refers to how wide,  in pixels,  the gadget should be. A string gadget
  10148. may  have a width less than the maximum number of characters it may contain,
  10149. as characters will be scrolled through the gadget when necessary.
  10150.  
  10151. You  may  read the current contents of a string gadget using the  StringText
  10152. function.
  10153.  
  10154. StringText$ (GadgetList#,ld)
  10155.  
  10156. The Stringtext$ function allows you to determine the current contents  of  a
  10157. string  gadget.  StringText$ will return a string of characters representing
  10158. the string gadgets contents.
  10159.  
  10160. Page 190
  10161.  
  10162. ActivateString Window#,ld
  10163.  
  10164. ActivateString  may  be used to 'automatically' activate  a  string  gadget.
  10165. This  is  identical to the program user having clicked in the string  gadget
  10166. themselves,   as  the  string  gadget's cursor  will  appear,   and  further
  10167. keystrokes will be sent to the string gadget.
  10168.  
  10169. It  is often nice of a program to activate Important string gadgets,  as  it
  10170. saves  the  user  the hassle of having to reach t'or the  mouse  before  the
  10171. keyboard.
  10172.  
  10173. ResetString GadgetList#,ld
  10174.  
  10175. ResetString  allows you to 'reset' a string gadget.   This  will  cause  the
  10176. string gadget's cursor position to be set to the leftmost position.
  10177.  
  10178. ClearString GadgetList#,ld
  10179.  
  10180. ClearString may be used to clear, or erase, the text in the specified string
  10181. gadget.  The cursor position will also be moved to the leftmost position  in
  10182. the string gadget.
  10183.  
  10184. If  a  string gadget is cleared while it is displayed in a window,  the text
  10185. will  not  be erased from the actual display.  To do this,  ReDraw  must  be
  10186. executed.
  10187.  
  10188. SetStri ng GadgetList#, ID, String$
  10189.  
  10190. SetString may be used to initialize the contents of a string gadget  created
  10191. with  the  StringGadget  command.    If   the  string  gadget  specified  by
  10192. GadgetList#  and  Id is already displayed,  you will also  need  to  exeucte
  10193. ReDraw to display the change.
  10194.  
  10195. PropGadget GadgetList#,X, Y,Flags,ld, Width,Height
  10196.  
  10197. The  PropGadget  command  is  used   to   create  a  'proportional  gadget'.
  10198. Proportional  gadgets present a program user with a 'slider bar',   allowing
  10199. them to adjust the slider to achieve a desired effect.  Proportional gadgets
  10200. are commonly used for the 'R G B' sliders seen in many paint packages.
  10201.  
  10202. Proportional  gadgets  have   2   main   qualities  -  a  'pot'  (short  for
  10203. potentiometer) setting, and a'body' setting.
  10204.  
  10205. The pot setting refers to the current position of the slider bar,  and is in
  10206. the  range O through I.  For example,  a proportional gadget which has  been
  10207. moved to 'half way' would have a pot setting of '.5'.
  10208.  
  10209. The  body  setting  refers to the size of the units the proportional  gadget
  10210. represents,  and is again in the range O through 1.  Again  taking  the  RGB
  10211. colour  sliders as an example,  each slider is intended to show a particular
  10212. value in the range O through 15 - giving a unit size,  or body setting,   of
  10213. 1/16 or '.0625'.
  10214.  
  10215. Put simply,  the pot setting describes 'where' the slider bar is,  while the
  10216. body setting describes 'how big' it is.
  10217.  
  10218. Proportional  gadgets may be represented as either horizontal  slider  bars,
  10219. vertical slider bars, or a combination of both.
  10220.  
  10221. See  the  beginning  of  the chapter for relevant Flags  settings  for  prop
  10222. gadgets.
  10223.  
  10224. X  and  Y  refer to the gadgets position,  relative to the top left  of  the
  10225. window it is opened in.  Width and Height refer to the size of the area  the
  10226. slider should be allowed to
  10227.  
  10228. Page 191
  10229.  
  10230. move in.
  10231.  
  10232. Id is a unique, non zero number which allows you to identify when the gadget
  10233. is mampulated.
  10234.  
  10235. Proportional  gadgets  may  be  altered  using  the  SetVProp  and  SetHProp
  10236. commands,  and read using the VPropPot,  VPropBody,  HPropPot and  HPropBody
  10237. functions.
  10238.  
  10239. SetHProp GadgetList#,ld,Pot,Body
  10240.  
  10241. SetHProp  is used to alter the horizontal slider qualities of a proportional
  10242. gadget. Both Pot and Body should be in the range O through l.
  10243.  
  10244. If  SetHProp  is  executed while the specified gadget is already  displayed,
  10245. execution of the ReDraw command will be necessary to display the changes.
  10246.  
  10247. For  a  full  discussion  on  proportional gadgets,   please  refer  to  the
  10248. PropGadget command.
  10249.  
  10250. SetVProp GadgetList#,ld,Pot, Body
  10251.  
  10252. SetVProp  is  used to alter the vertical slider qualities of a  proportional
  10253. gadget. Both Pot and Body should be in the range O through l.
  10254.  
  10255. If  SetVProp  is  executed while the specified gadget is already  displayed,
  10256. execution of the ReDraw command will be necessary to display the changes.
  10257.  
  10258. HPropPot (GadgetList#,ld)
  10259.  
  10260. The HPropPot function allows you to determine the current 'pot' setting of a
  10261. proportional gadget.  HPropPot will return a number from O up to,   but  not
  10262. including, l, reflecting the gadgets current horizontal pot setting.
  10263.  
  10264. HPropBody (GadgetList#,ld)
  10265.  
  10266. The HPropBody function allows you to determine the current 'body' setting of
  10267. a proportional gadget.  HPropBody will return a number from O up to, but not
  10268. including, l, reflecting the gadgets current horizontal body setting.
  10269.  
  10270. VPropPot (GadgetList#,ld)
  10271.  
  10272. The VPropPot function allows you to determine the current 'pot' setting of a
  10273. proportional gadget.
  10274.  
  10275. VPropPot will return a number from O up to, but not including, l, reflecting
  10276. the gadgets current vertical pot setting.
  10277.  
  10278. VPropBody (GadgetList#,ld)
  10279.  
  10280. The VPropBody function allows you to determine the current 'body' setting of
  10281. a proportional gadget.
  10282.  
  10283. VPropBody  will  return  a  number from O up to,   but  not  including,   l,
  10284. reflecting the gadgets current vertical body setting.
  10285.  
  10286. Redraw Window#,id
  10287.  
  10288. ReDraw  will  redisplay the specified gadget in the specified window.   This
  10289. command  is mainly of use when a proportional gadget has been altered  using
  10290. SetHProp or SetVProp and needs to be redrawn, or when a string gadget has
  10291.  
  10292. Page 192
  10293.  
  10294. been cleared using ClearString, and, likewise, needs to be redrawn.
  10295.  
  10296. Borders [Onl Off]l [Width, Height]
  10297.  
  10298. Borders serves 2 purposes.  First, Borders may be used to turn on or off the
  10299. automatic  creation of borders around text and string gadgets.  Borders  are
  10300. created  when  either a Textgadget or StringGadget command is executed.   If
  10301. you  wish  to  disable  this,  Borders Off should  be  executed  before  the
  10302. appropriate TextGadget or StringGadget command.
  10303.  
  10304. Borders  may also be used to specify the spacing between a gadget  and  it's
  10305. border,   Width  referring to the left/right spacing,   and  Height  to  the
  10306. above/below spacing.
  10307.  
  10308. BorderPens Highlight Colour,Shadow Colour
  10309.  
  10310. BorderPens  allows you to control the colours used when gadget  borders  are
  10311. created.  Gadget borders may be created by the TextGadget,  StringGadget and
  10312. GadgetBorder commands.
  10313.  
  10314. HighLight  Colour  refers to the colour of the top and  left  edges  of  the
  10315. border, while Shadow Colour refers to the right and bottom edges.
  10316.  
  10317. The  default value for HighLight Colour is l.  The default value for  Shadow
  10318. Colour is 2.
  10319.  
  10320. Gadget Bo rde r X, Y, Width, Heigh t
  10321.  
  10322. The  GadgetBorder command may be used to draw a rectangular border into  the
  10323. currently used window.
  10324.  
  10325. Proportional  gadgets  and shape gadgets do not have  borders  automatically
  10326. created  tor them.  The GadgetBorder command may be used,  once a window  is
  10327. opened, to render borders around these gadgets.
  10328.  
  10329. X,Y,   Width  and  Height refer to the position of the gadget  a  border  is
  10330. required around.  GadgetBorder will automatically insert sapces between  the
  10331. gadget and the border.  The Borders command may be used to alter the  amount
  10332. of spacing.  Of course, GadgetBorder may be used to draw a border around any
  10333. arbitary area, regardless of whether or not that area contains a gadget.
  10334.  
  10335. GadgetStatus (GadgetList#,ld)
  10336.  
  10337. GadgetStatus may be used to determine the status of the specified gadget. In
  10338. the case of toggle' type gadget,  GadgetStatus will return true (-l)  if the
  10339. gadget is currently on, or false (O) if the gadget is currently off.
  10340.  
  10341. In the case of a cycling text gadget,  GadgetStatus will return a value of l
  10342. or greater representing the currently displayed text within the gadget.
  10343.  
  10344. Buttonid (GadgetList#,ButtonGroup)
  10345.  
  10346. ButtonId  may  be used to determine which gadget within a  group  of  button
  10347. type gadgets is currently selected.  The value returned will be the GadgetId
  10348. of the button gadget currently selected.
  10349.  
  10350. Page 193
  10351.  
  10352. Enable GadgetList#,ld
  10353.  
  10354. A gadget when disabled is covered by a "mesh" and can not be accessed by the
  10355. user.   The commands Enable and Disable allow the programmer to access  this
  10356. feature of Intuition.
  10357.  
  10358. Disable GadgetList#,ld
  10359.  
  10360. A gadget when disabled is covered by a "mesh" and can not be accessed by the
  10361. user.   The commands Enable and Disable allow the programmer to access  this
  10362. feature of Intuition.
  10363.  
  10364. Toggle GadgetList#,ld [,On| Off]
  10365.  
  10366. The  Toggle  command  in the gadget library has been  extended  so  it  will
  10367. actually toggle a gadgets status if the On| Off parameter is missing.
  10368.  
  10369. Page 194
  10370.  
  10371. R-25: MENU COMMANDS
  10372.  
  10373. Blitz supports many commands for the creation and use of Intuition menus.
  10374.  
  10375. Menus  are  created  through  the use of MenuList  objects.   Each  menulist
  10376. contains  an  entire set of menu titles,  menu items and possibly  sub  menu
  10377. items.
  10378.  
  10379. Menulists are attached to windows through the SetMenu command.
  10380.  
  10381. Each  window  may use a separate menulist,  allowing you to attach  relevant
  10382. menus to different windows.
  10383.  
  10384. MenuTitle Menulist#,Menu,Title$
  10385.  
  10386. MenuTitle is used to add a menu title to a menulist. Menu titles appear when
  10387. the right mouse button is held down,  and usually have menuitems attached to
  10388. them.
  10389.  
  10390. Menu  specifies  which menu the title should be used for.   Higher  numbered
  10391. menus  appear  further to the right along the menu bar,  with  O  being  the
  10392. leftmost menu.  Menutitles should be added in left to right order, with menu
  10393. O being the first created, then I and so on...
  10394.  
  10395. Title$ is the actual text you want to appear when the right mouse button  is
  10396. pressed.
  10397.  
  10398. Menultem MenuList#, Flags, Menu,ltem,ltemtext$[, Shortcut$]
  10399.  
  10400. Menultem  is used to create a text menu item.  Menu items appear  vertically
  10401. below  menu titles when the mouse is moved over a menu title with the  right
  10402. mouse button held down.
  10403.  
  10404. Flags affects the operation of the menu item.  A value of O creates a  stand
  10405. 'seleect' menu item.
  10406.  
  10407. A  value of I creates a 'toggle' menu item.  Toggle menu items are used  for
  10408. 'on/off' type options.  When a toggle menu item is selected,  it will change
  10409. state between on and off.  An 'on' toggle item is identified by a 'tick'  or
  10410. check mark.
  10411.  
  10412. A  value  of  2 creates a special type of toggle menu item.  Any menu  items
  10413. which  appear under the same menu with a Flags setting of 2 are said  to  be
  10414. mutually exclusive.  This means that only I of them may begin the 'on' state
  10415. at  one time.  If a menu item of this nature is toggled into the 'on' state,
  10416. any  other mutually exclusive menu items which may have previously been 'on'
  10417. will be automatically turned 'off'.
  10418.  
  10419. Flags  values of 3 and 4 correspond to values I and 2,  only the  item  will
  10420. initially appear in the 'on' state.
  10421.  
  10422. Menu specifies the menu title under which the menu item should appear.
  10423.  
  10424. Item specifies the menu item number this menu item should be referenced  as.
  10425. Higher numbered items appear further down a menu item list, with O being the
  10426. topmost  item.  Menu items should be added in 'top down' order,   with  menu
  10427. item O being the first item created.
  10428.  
  10429. Itemtext$ is the actual text for the menu item.
  10430.  
  10431. An optional Shortcut$ string allows you to select a one character 'keyboard
  10432.  
  10433. Page 195
  10434.  
  10435. shortcut' for the menu item.
  10436.  
  10437. Shapeltem MenuList#, Flags,Menu, Item, Shape#
  10438.  
  10439. ShapeItem is used to create a graphical menu item.
  10440.  
  10441. Shape#  refers to a previously initialized shape object to be  used  as  the
  10442. menu  item's  graphics.  All other parameters are  identical  to  those  for
  10443. MenuItem.
  10444.  
  10445. Subitem Men uList#, Flags, Menu, ltem, Subitem, Subitem text$t Shortcut$]
  10446.  
  10447. All menu items may have an optional list of sub menu items attached to them.
  10448. To attach a sub menu item to a menu item, you use the SubItem command.
  10449.  
  10450. Item specifies the menu item to attach the sub item to.
  10451.  
  10452. Subitem refers to the number of the sub menu item to attach. Higher numbered
  10453. sub items appear further down a sub item list,  with 0 being the topmost sub
  10454. item.  Sub items should be added in 'top down' order,  with sub item 0 being
  10455. created first.
  10456.  
  10457. .   Subitemtext$ specifies the actual text for the sub item.  As  with  menu
  10458. items,   sub  items  may  have  an  optional  keyboard  shortcut  character,
  10459. specified using the Shortcut$ parameter.
  10460.  
  10461. All other parameters are identical to the MenuItem command.
  10462.  
  10463. ShapeSub MenuList#,Flags,Menu,ltem,Subitem,Shape#
  10464.  
  10465. ShapeSub  allows you to create a graphic sub menu item.  Shape# specifies  a
  10466. previously created shape object to be used as the sub item's graphics.
  10467.  
  10468. All other parameters are identical to those in SubItem.
  10469.  
  10470. SetMenu MenuList#
  10471.  
  10472. SetMenu  is  used to attach a menulist to the currently used  window.   Each
  10473. window may have only one menulist attached to it.
  10474.  
  10475. MenuGap X Gap, Y Gap
  10476.  
  10477. Executing  MenuGap  before creating any menu titles,  items  or  sub  items,
  10478. allows you to control the layout of the menu.
  10479.  
  10480. X Gap refers to an amount,  specified in pixles,  to be inserted to the left
  10481. and  right of all menu items and sub menu items.  Y Gap refers to an amount,
  10482. again in pixels,  to be inserted above and below all menu items and sub menu
  10483. items.
  10484.  
  10485. SubitemOff X Offset, Y Offset
  10486.  
  10487. SubItemOff allows you to control the relative position of the top of a  list
  10488. of sub menu items, in relation to their associated menu item.
  10489.  
  10490. Whenver a menu item is created which is to have sub menu items,  it's a good
  10491. idea to append the name of the menu item with the '>>' character.  This  may
  10492. be  done using Chr$(187).  This gives the user a visual indication that more
  10493. options are available. To position the sub menu items correctly so that they
  10494. appear after the '>>' character, SubItemOff should be used.
  10495.  
  10496. Page 196
  10497.  
  10498.  
  10499. MenuState MenuList#t Menu[, Item[, Subitem]]], Onl Off
  10500.  
  10501. The MenuState command allows you to turn menus, or sections of menus, on
  10502. or off.
  10503.  
  10504. MenuState with just the MenuList# parameter may be used to turn an entire
  10505. menu list on or off.
  10506.  
  10507. MenuState with MenuList# and Menu parameters may be used to turn a menu
  10508. on or off.
  10509.  
  10510. Similarly,   menu items and sub items may be turned on or off by  specifying
  10511. the appropriate parameters.
  10512.  
  10513. MenuColour Colour
  10514.  
  10515. MenuColour  allows you to determine what colour any menu item  or  sub  item
  10516. text  is  rendered in.  MenuColour should be executed before the  approprate
  10517. menu item commands.
  10518.  
  10519. Men uChecked (MenuList#, Menu,ltem[, Subitemp
  10520.  
  10521. The  MenuChecked function allows you to tell whether or not a 'toggle'  type
  10522. menu item or menu sub item is currently 'checked' or ton'.  If the specified
  10523. menu item or sub item is in fact checked,  MenuChecked will return 'true' (-
  10524. l). If not, MenuChecked will return 'false' (O).
  10525.  
  10526. Page 197
  10527.  
  10528. R-26: GADTOOLS COMMANDS
  10529.  
  10530. GadTools  are a new system of Gadgets added to the Amiga's operating  system
  10531. in    version 2.0.  They are Improved in both looks and performance over the
  10532. older standard Gadgets.
  10533.  
  10534. In  order for certain GadTools gadgets to tunction correctly the first thing
  10535. to make sure is that the Window has the correct IDCMP flags set:
  10536.  
  10537. #MOUSEMOVE=$10 ;needed when user drags a slider #INTUITICKS=$400000  ;needed
  10538. when user holds down an arrow AddIDCMP#MOWSEMOVE+#INTUITICKS
  10539.  
  10540. To add GadTools Gadgets to the window simply create a list from the commands
  10541. listed below and use the AttachGTList command to add them to the window.
  10542.  
  10543. For most GTGadgets your program should only act on a #GadgetUp message.  The
  10544. GadgetHit  function will return the ID of the gadget the user has  just  hit
  10545. and the EventCode function will contain it's new value.
  10546.  
  10547. Use  GTGetString  and GTGetInteger functions to read  the  contents  of  the
  10548. GadTools string gadgets after a #GadgetUp message.
  10549.  
  10550.     GTadgetFlag        Value
  10551.     #_LEFT    =    I    ;position of text label
  10552.     #_RIGHT    =    2
  10553.     #_ABOVE    =    4
  10554.     #_BELOW    =    8
  10555.     #_IN    =    $10
  10556.     #_Highlight    =    $20    ;gadget is highlighted initially
  10557.     #_Disable    =    ,$40    ;gadget is disabled initially
  10558.     #_Immediate    =    $X0    ;report GadgetDown flag
  10559.     # BoolValue    =    $100    ;gadget is on initially
  10560.  
  10561.     #_Scaled    =    $200 ;scale arrowsize on scroller gadget
  10562.     # Vertical    =    $400 ;make GTPropGadget vertical
  10563.  
  10564. GTButton GTList#, id,x,y, w,h, Text$, flags
  10565.  
  10566. Same  as  Blitz's TextGadget but with the added flexibility of  placing  the
  10567. label Text$ above, below to the left or right of the button (see flags).
  10568.  
  10569. GTCheckBox GTList#,id,x,y, w,h, Text$,flags
  10570.  
  10571. A box with a check mark that toggles on and off,  best used for options that
  10572. are either enabled or disabled.
  10573.  
  10574. GTCycle GTList#,id,x,y, w,h, Text$,flags, Options$
  10575.  
  10576. Used for offering the user a range of options,  the options string should be
  10577. a list
  10578.  
  10579. Page 198
  10580.  
  10581. of options separated by the l character ea. "HIRES l LORES l SUPER HIRES "
  10582.  
  10583. GTlnteger GTList#,id,x,y, w,h, Text$,flags,default
  10584.  
  10585. A  string  gadget  that allows only numbers to be entered  by  the  user.See
  10586. GTSetInteger and GTGetInteger for information about accessing  the  contents
  10587. of a GTInteger gadget.
  10588.  
  10589. GTListView GTList#,id,x,y, w,h, Text$,f/ags,/istO
  10590.  
  10591. The  ListView gadget enables the user to scroll through a list  of  options.
  10592. These  options must be contained in a string field of a Blitz  linked  list.
  10593. Currently  this string field must be the second field,  the  first  being  a
  10594. word type. *See the GTChangeList command for more details.
  10595.  
  10596. GTMX GTList#,id,x,y, w,h, Text$,f/ags, Options$
  10597.  
  10598. GTMX  is an exclusive selection gadget,  the Options$ is the same as GTCycle
  10599. in  format,  GadTools then displays all the options in a vertical list  each
  10600. with a hi-light beside them.
  10601.  
  10602. GTNumber GTList#,id,x,y, w, h, Text$, f/ags, va/ue
  10603.  
  10604. This  is  a readonly gadget (user cannot interact with it)  used to  display
  10605. numbers. See GTSetInteger to update the contents of this read only "display"
  10606. gadget.
  10607.  
  10608. GTPalette GTList#,id,x,y, w,h, Text$, f/ags, depth
  10609.  
  10610. Creates a number of coloured boxes relating to a colour palette,
  10611.  
  10612. GTSc roller GTList#,id,x,y, w,h, Text$, f/ags, Visib/e, Tota/
  10613.  
  10614. A  prop  type  gadget  tor  the user to control  an  amount  or  level,   is
  10615. accompanied by a set of arrow gadgets
  10616.  
  10617. GTSlider GTList#,id,x,y, w,h, Text$,f/ags,Min,Max
  10618.  
  10619. Same  as  Scroller but for controlling the position of the display inside  a
  10620. larger view.
  10621.  
  10622. GTString GTList#,id,x,y,w,h,Text$,flags,MaxChars
  10623.  
  10624. A  standard  string  type  gadget.   See  GTSetString  and  GTGetString  for
  10625. accessing the contents of a GTString gadget.
  10626.  
  10627. GTText GTList#,id,x,y, w,h, Text$,f/ags,Disp/ay$
  10628.  
  10629. A  read  only  gadget  (see GTNumber)  for displaying  text  messages.   See
  10630. GTSetString for updating the contents of this read only "display" gadget.
  10631.  
  10632. GTShape  GTList#,   id,x,y,  f/ags,Shape#[,  Shape#] Similar  to  the  Blitz
  10633. ShapeGadget allowing IFF graphics that are loaded into
  10634.  
  10635. Page 199
  10636.  
  10637. Blitz shape objects to be used as gadgets in a window.
  10638.  
  10639. AttachGTList GTList#, Window#
  10640.  
  10641. The  AttachGTList command is used to attach a set of GadTools gadgets  to  a
  10642. Window after it has been opened.
  10643.  
  10644. GTTags Tag, Value 1,Tag, Value...]
  10645.  
  10646. The  GTTags  command can be used prior to initialisation of any  of  the  12
  10647. gadtools gadgets to preset any relevant Tag fields.  The following are  some
  10648. useful Tags that can be used with GTTags:
  10649.  
  10650. #tag=$80080000            
  10651. #GTCB Checked=#tag+4        ; State of checkbox
  10652. #GTLV_Top=#tag+5        ; Top visible item in listview
  10653. #GTLV_ReadOnly=#tag+7        ; Set TRUE if lisiview is ReadOnly
  10654. #GTMX_Active=#tag+ 10        ; Active one in mx gadget
  10655. #GTTX_Text=#tag+l ]        ; Text to display
  10656. #GTNM_Number=#tag+ 13        ; Number to display
  10657. #GTCY_Active=#tag+ 15        ; The active one in the cycle gad
  10658. #GTPA_Color=#tag+ 17        ; Palette color
  10659. #GTPA ColorOffset=#tag+ 18    ; First color to use in palette
  10660. #GTSC_Top=#tag+21        ; Top visible in scroller
  10661. #GTSC_Total=#tag+22        ; Total in scroller area
  10662. #GTSC_Visible=#tag+23        ; Number visible in scroller
  10663. #GTSL_Level=#tag+40        ; Slider level
  10664. #GTSL_MaxLevelLen=#tag+41    ; Max length of printed level
  10665. #GTSL_LevelFormat=#tag+42    ;* Format string for level
  10666. #GTSL_LevelPlace=#tag+43    ;* Where level should be placed
  10667. #GTLV_Selected=#tag+54        ; Set ordinal number of selected
  10668. #GTMX_Spaci ng=#tag+61        ;* Added to font height
  10669.  
  10670. All  of  the above except for those marked * can be set after initialisation
  10671. of the Gadget using the GTSetAttrs command.
  10672.  
  10673. The  following  is  an example of creating a slider gadget  with  a  numeric
  10674. display:
  10675.  
  10676. f$="%21d    "   GTTags   #GTSLLevelFormat,&f$,#GTSLMaxLevelLen,4    GTSlider
  10677. 2,10,320,120,200,20,"GTSLIDER",2,0,10
  10678.  
  10679. GTGadPtr (GTList#,id)
  10680.  
  10681. GTGadPtr  returns  the actual location of the specified GadTools  gadget  in
  10682. memory.
  10683.  
  10684. GTBevelBox GTList#,x,y,w,h,flags
  10685.  
  10686. GTBevelBox  is  the GadTools library equivalent of the Borders  command  and
  10687. can be used to render frames and boxes in the currently used Window.
  10688.  
  10689. Page 200
  10690.  
  10691. GTChangeList GTList#,id [,List() ]
  10692.  
  10693. GTChangeList must be used whenever a List attached to a GTListView needs  to
  10694. be  modified.  Call GTChangeList without the List()  parameter to  free  the
  10695. List, modify it then reattach it with another call to GTChangeList this time
  10696. using the List() parameter.
  10697.  
  10698. GTSetAttrs GTList#,id [, Tag, Value...]
  10699.  
  10700. GTSetAttrs can be used to modify the status of certain GadTools gadgets with
  10701. the relevant Tags. See GTTags for more information.
  10702.  
  10703. GTSetString GTList#,id,string$
  10704.  
  10705. Used  with  both  GTString and GTText gadgets,  GTSetString  will  not  only
  10706. update the contents of the gadget but redraw it also.
  10707.  
  10708. GTSetinteger GTList#,id,value
  10709.  
  10710. Used  with both GTInteger and GTNumber gadgets,  GTSetInteger will not  only
  10711. update the contents of the gadget but redraw it also.
  10712.  
  10713. GTGetString GTList#,id
  10714.  
  10715. Used to read the contents from a GTString gadget.
  10716.  
  10717. GTGetinteger GTList#,id
  10718.  
  10719. Used to read the contents from a GTlnteger gadget.
  10720.  
  10721. GTGetAttrs (GTList#,id, Tag)
  10722.  
  10723. A 3.0 specific command. See C= documentation for more information.
  10724.  
  10725. GTEnable GTList#,ld
  10726.  
  10727. Allows GTGadgets to be enabled and disabled.
  10728.  
  10729. GTDisable GTList#,ld
  10730.  
  10731. Allows GTGadgets to be enabled and disabled.
  10732.  
  10733. GTToggle GTList#,ld[,Onl Off]
  10734.  
  10735. GTToggle  allows the programmer to set Boolean gadgets such as GTButton  and
  10736. GTCheckbox to a desired state.
  10737.  
  10738. GTStatus (GTList#,ld)
  10739.  
  10740. GTStatus returns the status of the gadtools toggle gadgets,  a  value  of  ]
  10741. means the the gadget is selected, O deselected.
  10742.  
  10743. Page 201
  10744.  
  10745.  
  10746. R-27: ASL LIBRARY COMMANDS
  10747.  
  10748. The  ASL Library features several friendly requesters that programs can  use
  10749. on machines equipped with WorkBench 2.0 and above.
  10750.  
  10751. ASLFileRequest$ (Title$,Pathname$,Filename$ tPattern$] [,x,y, w,h] )
  10752.  
  10753. The  ASL  File  Requester  is  nice.  Except tor  the  highlight  bar  being
  10754. invisible on directories you get to use keyboard for everything,  stick in a
  10755. pattern$  to  hide certain files and of course you get what  ever  size  you
  10756. want.   I  made it call the Blitz file requester if the program  is  running
  10757. under 1.3 (isn't that nice!).  There is a fix that patches the ReqTools file
  10758. requester but that doesn't have the date field.
  10759.  
  10760. I  couldn't  get the Save-Only tag or the "Create Directory" option  working
  10761. maybe next upgrade.
  10762.  
  10763. ASLPathRequest$ (Title$,Pathname$ [,x,y, w,h] )
  10764.  
  10765. Same  as  ASLFileRequest$ except will just prompt the user for a  path  name
  10766. (directory) rather than an actual file.
  10767.  
  10768. ASLFontRequest (enable flags)
  10769.  
  10770. The  ASL  Font Requester is also pretty useful.  The flags parameter enables
  10771. the user to modify the following options:
  10772.  
  10773. #pen=1 :#bckgrnd=2:#style=4:#drawmode=8:#fixsize=16
  10774.  
  10775. It  doesn't seem to handle colour fonts,  no keyboard shortcuts  so  perhaps
  10776. patching ReqTools is an option for this one.  The following code illustrates
  10777. how  a .fontinfo structure is created by a call to ASLFontRequest (just like
  10778. programming in a high level language man!).
  10779.  
  10780. ASLScreenRequest (enable flags)
  10781.  
  10782. Those  who  are  just  getting to grips with 2.0 and above  will  find  this
  10783. command makes your programs look really good,  however I haven't got time to
  10784. explain  the  difficulties of developing programs that work  in  all  screen
  10785. resolutions (what are ya?).
  10786.  
  10787. NEWTYPE .fontinfo
  10788. name.s
  10789. ysize.w
  10790. style.b:flags.b
  10791. pen1.b:pen2:drawmode:pad
  10792. End NEWTYPE
  10793.  
  10794. FindScreen O
  10795.  
  10796. *f.fontinfo=ASLFontRequest(15)
  10797.  
  10798. If *f
  10799.     NPrint *f\name
  10800.     NPrint *f\ysize
  10801.     NPrint *f\penl
  10802.     NPrint *f\pen2
  10803.     NPrint 8f\drawmode
  10804. Else
  10805.     NPrint "cancelled"
  10806. Endif
  10807.  
  10808. MouseWait
  10809.  
  10810. Page 202
  10811.  
  10812.  
  10813. R-28: AREXX CONTROL COMMANDS
  10814.  
  10815. ARexx allows communication between different Amiga applications allowing for
  10816. some extensive and powerful control over applications by the programmer.
  10817.  
  10818. CreateMsgPort ("Name")
  10819.  
  10820. CreateMsgPort is a general Function and not specific to ARexx.
  10821.  
  10822. CreateMsgPort  opens an intuition PUBLIC message port of the  name  supplied
  10823. as the only argument. If all is well the address of the port created will be
  10824. returned to you as a LONGWORD so the variable that you assign it  to  should
  10825. be of type long.
  10826.  
  10827. If  you do not supply a name then a private MsgPort will be opened for  you.
  10828. Port. I =CreateMsgPort( " PortName" )
  10829.  
  10830. It  is important that you check you actually succeeded in opening a port  in
  10831. your program. The following code or something similar will suffice.
  10832.  
  10833. Port. I=CreateMsgPort( "Name" ) IF Port=0 THEN Error_Routine{ }
  10834.  
  10835. The  name  you give your port will be the name that Arexx looks for  as  the
  10836. HOST  address,(and is case sensitive)  so take this into consideration  when
  10837. you  open  your port.  NOTE IT MUST BE A UNIQUE NAME AND SHOULD NOT  INCLUDE
  10838. SPACES.
  10839.  
  10840. DeleteMsgPort()  is used to remove the port later but this is  not  entirely
  10841. necessary as Blitz will clean up for you on exit if need be.
  10842.  
  10843. DeleteMsgPort (Port)
  10844.  
  10845. DeleteMsgPort    deletes   a   MessagePort   previously    allocated    with
  10846. CreateMsgPort().  The only argument taken by DeleteMsgPort  is  the  address
  10847. returned by CreateMsgPort().  If the Port was a public port then it will  be
  10848. removed from the public port list.
  10849.  
  10850. Port. l=CreateMsgPort( "Name") IF Port=0 Then End DeleteMsgPort Port
  10851.  
  10852. Error checking is not critical as if this fails we have SERIOUS PROBLEMS.
  10853.  
  10854. YOU  MUST WAIT FOR ALL MESSAGES FROM AREXX TO BE RECEIVED BEFORE YOU  DELETE
  10855. THE  MSGPORT.  h YOU NEGLECT TO DELETE A MSGPORT BLITZ2 WILL DO IT  FOR  YOU
  10856. AUTOMATICALLY ON PROGRAM EXIT.
  10857.  
  10858. CreateRexxMsg (ReplyPort,"exten' "HOST")
  10859.  
  10860. CreateRexxMsg()  allocates a special Message structure used  to  communicate
  10861. with  Arexx.  If all is successful it returns the LONGWORD address  of  this
  10862. rexxmsg structure.
  10863.  
  10864. The  arguments  are  ReplyPort  which   is  the  long  address  returned  by
  10865. CreateMsgPort().  This is the Port that ARexx will reply  to  after  it  has
  10866. finished with the message.
  10867.  
  10868. Page 203
  10869.  
  10870. EXTEN  which is the exten name used by any ARexx script you are  wishing  to
  10871. run.  i.e. if you are attempting to run the ARexx script test.rexx you would
  10872. use an EXTEN of "rexx".
  10873.  
  10874. HOST is the name string of the HOST port.  Your program is usually the  HOST
  10875. and  so  this  equates  to the name you gave your port  in  CreateMsgPort().
  10876. REMEMBER IT IS CASE SENSITIVE.
  10877.  
  10878. As  we  are  allocating resources error checking is  important  and  can  be
  10879. achieved with the following code:
  10880.  
  10881. msg.l=CreateRexxMsg(Port, "rexx","HostName" ) IF msg=0 THEN Error_Routine{ }
  10882. DeleteRexxMag rexxmsg
  10883.  
  10884. DeleteRexxMsg  simply  deletes a RexxMsg Structure previously  allocated  by
  10885. CreateRexxMsg().  It takes a single argument which is the long address of  a
  10886. RexxMsg structure such as returned by CreateRexxMsg().
  10887.  
  10888. msg.l=CreateRexxMsg(Port, "rexx ","HostName") IF msg=0 THEN Error Routine( }
  10889. DeleteRexxMsg msg
  10890.  
  10891. Again if you neglect to delete the RexxMsg structure Blitz will do this  for
  10892. you on exit of the program.
  10893.  
  10894. ClearRexxMsg Arexxmsg
  10895.  
  10896. ClearRexxMsg is used to delete and clear an ArgString from one  or  more  of
  10897. the Argument slots in a RexxMsg Structure.  This is most useful for the more
  10898. advanced  programmer  wishing  to   take  advantage  of  the  Arexx  #RXFUNC
  10899. abilities.
  10900.  
  10901. The  arguments  are a LONGWORD address of a RexxMsg structure.  ClearRexxMsg
  10902. will always work from slot number I forward to 16.
  10903.  
  10904. FillRexxMsg ( rexxmsg,&FillStruct)
  10905.  
  10906. FillRexxMsg  allows  you to fill all 16 ARGSlots if  necessary  with  either
  10907. ArgStrings  or numerical values depending on your requirement.   FillRexxMsg
  10908. will  only  be used by those programmers wishing to do more advanced  things
  10909. with  Arexx,  including adding libraries to the ARexx library list,   adding
  10910. Hosts,Value Tokens etc.  It is also needed to access Arexx using the #RXFUNC
  10911. flag.  The arguments are a LONG Pointer to a rexxmsg.  The LONG address of a
  10912. FillStruct  NEWTYPE structure.  This structure is defined in  the  Arexx.res
  10913. and has the following form.
  10914.  
  10915. NEWTYPE .FillStruct
  10916.  
  10917.     Flags.w    ;Flag block
  10918.     ArgsO.1    ; argument block (ARG0-ARG15)
  10919.     Argsl.l    ; argument block (ARG0-ARG15)
  10920.     Args2.1    ; argument block (ARG0-ARG15)
  10921.     Args3.1    ; argument block (ARG0-ARG15)
  10922.     Args4.1    ; argument block (ARG0-ARG15)
  10923.     Args5.1    ; argument block (ARG0-ARG15)
  10924.     Args6.1    , argument block (ARG0-ARG15)
  10925.     Args7.1    , argument block (ARG0-ARG15)
  10926.     Args8.1    ; argument block (ARG0-ARG15)
  10927.  
  10928. Page 204
  10929.  
  10930.  
  10931. Args9.1        ; argument block (ARG0-ARG15)
  10932. Argsl O.l    ; argument block (ARG0-ARG15)
  10933. Argsl 1.1    ; argument block (ARG0-ARG15)
  10934. Argsl2.1    ; argument block (ARG0-ARG15)
  10935. Argsl3.1    ; argument block (ARG0-ARG15)
  10936. Argsl4.1    ; argument block (ARG0-ARG15)
  10937. Args 1 5.1    ; argument block (ARG0-ARG15)
  10938. EndMark.l    ; End of the FillStruct
  10939. End NEWTYPE
  10940.  
  10941. The  Args?.l  are  the  16  slots  that can possibly  be  filled  ready  for
  10942. converting  into  the  RexxMsg structure.   The  Flags.w  is  a  WORD  value
  10943. representing  the  type  of  LONG word you are supplying  for  each  ARGSLOT
  10944. (Arg?.l).
  10945.  
  10946. Each  bit in the Flags WORD is representative of a single Args?.l,  where  a
  10947. set  bit  represents  a  numerical value  to  be  passed  and  a  clear  bit
  10948. represents  a  string  argument  to be converted  into  a  ArgString  before
  10949. installing in the RexxMsg.  The Flags Value is easiest to supply as a binary
  10950. number to make the bits visible and would look like this.
  10951.  
  10952. %0000000000000000    ;represents   that   all   Arguments    are    Strings.
  10953. %0110000000000000 ;represent second&third as being integers.
  10954.  
  10955. FillRexxMsg expects to find the address of any strings in the Args?.l  slots
  10956. so  it is important to remember when filling a FillStruct that you must pass
  10957. the  string  address  and not the name of the string.  This  is  acomplished
  10958. using the '&' address of operand.
  10959.  
  10960. So to use FillRexxMsg we must do the following things in our program:
  10961.  
  10962. 1. Allocate a FillStruct 2. Set the flags in the FillStruct\Flags.w
  10963.  
  10964. 3.   Fill the FillStruct with either integer values or the addresses of  our
  10965. string arguments.
  10966.  
  10967. 4.   Call  FillRexxMsg with the LONG address of our  rexxmsg  and  the  LONG
  10968. address of our FillStruct.
  10969.  
  10970. To accomplish this takes the following code:
  10971.  
  10972. ;Allocate our FillStruct (called F)
  10973. DEFTYPE.FillStruct F
  10974. ;assign some string arguments
  10975. T$="open " :T1$="-0123456789"
  10976. ;Fill in our FillStruct with flags and (&) addresses of our strings
  10977. F\Flags= %001 0000000000000,&T$,&T I $,4
  10978. ;Third argument here is an integer (4).
  10979. Port.l=CreateMsgPort( "host")
  10980. msg.l=CreateRexxMsg(Port,"vc","host")
  10981. FillRexxMsg msg,&F
  10982. ;<-3 ergs see #RXFUNC
  10983. SendRexxCommand msg,"",#RXFUNCI #RXFF RESULTI 3
  10984.  
  10985. Page 205
  10986.  
  10987.  
  10988. CreateArgString ("this is a string")
  10989.  
  10990. CreateArgString()  builds an ARexx compatible ArgString structure around the
  10991. provided string.  All strings sent to,  or received from Arexx  are  in  the
  10992. form of ArgStrings. See the TYPE RexxARG.
  10993.  
  10994. If  all  is  well  the  return  will  be a LONG  address  of  the  ArgString
  10995. structure.   The  pointer will actually point to the NULL terminated  String
  10996. with the remainder of the structure available at negative offsets.
  10997.  
  10998. DeleteArgString ArgString
  10999.  
  11000. DeleteArgString is designed to Delete ArgStrings allocated by  either  Blitz
  11001. or  ARexx in a system friendly way.  It takes only one argument the LONGWORD
  11002. address of an ArgString as returned by CreateArgString().
  11003.  
  11004. SendRexxCom mend rexxmsg, "commands/ring ",#RXCOMMI #RXFF RESUL T
  11005.  
  11006. SendRexxCommand  is designed to fill and send a RexxMsg structure  to  ARexx
  11007. inorder to get ARexx to do something on your behalf.  The arguments  are  as
  11008. follows;
  11009.  
  11010. rexxmsg:   the  LONGWORD  address  of a RexxMsg  structure  as  returned  by
  11011. CreateRexxMsg().
  11012.  
  11013. commands/ring:  the command string you wish to send to  ARexx.   This  is  a
  11014. string as in "this is a string" and will vary depending on what you wish  to
  11015. do  with ARexx.  Normally this will be the name of an ARexx script file  you
  11016. wish to execute.  ARexx will then look for the script by the name as well as
  11017. the  name with the exten added.(this is the exten you used when you  created
  11018. the  RexxMsg structure using CreateRexxMsg()).  This could also be a  string
  11019. file. That is a complete ARexx script in a single line.
  11020.  
  11021. ActionCodes:  the flag values you use to tell ARexx what you want it  to  do
  11022. with the commandstring you have supplied.
  11023.  
  11024. COMMAND (ACTION) CODES
  11025.  
  11026. The command codes that are currently implemented in the resident process are
  11027. described  below.  Commands are listed by their mnemonic  codes,followed  by
  11028. the valid modifier flags.  The final code value is always the logical OR  of
  11029. the code value and all of the modifier flags selected.  The command code  is
  11030. installed in the rm_Action field of the message packet.
  11031.  
  11032. RXADDCON:
  11033.  
  11034. This  code specifies an entry to be added to the Clip List.  Parameter  slot
  11035. ARGO points to the name string,slot ARGI points to the value string,and slot
  11036. ARG2 contains the length of the value string.
  11037.  
  11038. The  name and value arguments do not need to be argstrings,but can  be  just
  11039. pointers  to storage areas.  The name should be a null-terminated string,but
  11040. the value can contain arbitrary data including nulls.
  11041.  
  11042. Page 206
  11043.  
  11044. RXADDFH:
  11045.  
  11046. This  action code specifies a function host to be added to the Library List.
  11047. Parameter  slot  ARGO points to the (null-terminated)  host name  string,and
  11048. slot  ARG  I  holds  the search priority for the node.  The search  priority
  11049. should  be an integer between 100 and -100 inclusive;the remaining  priority
  11050. ranges  are  reserved for future extensions.  If a node already exists  with
  11051. the same name,the packet is returned with a warning level error code.
  11052.  
  11053. Note that no test is made at this time as to whether the host port exists.
  11054.  
  11055. RXADDLIB:
  11056.  
  11057. This code specifies an entry to be added to the Library List. Parameter slot
  11058. ARGO  points to a null-terminated name string referring either to a function
  11059. library  or  a function host.  Slot ARG I is the priority for the  node  and
  11060. should  be an integer between 100 and -100 inclusive;the remaining  priority
  11061. ranges  are  reserved for future extensions.  Slot ARG2 contains  the  entry
  11062. Point offset and slot ARG3 is the library version number.  If a node already
  11063. exists with the same name,the packet is returned with a warning level  error
  11064. code.   Otherwise,a  new  entry is added and the  library  or  host  becomes
  11065. available to ARexx programs.  Note that no test is made at this time  as  to
  11066. whether the library exists and can be opened
  11067.  
  11068. RXCOMM [RXFF_TOKEN] [RXFF STRING] [RXFF_RESULT] [RXFF N010]
  11069.  
  11070. Specifies  a  command-mode invocation of an ARexx program.   Parameter  slot
  11071. ARGO  must  contain an argstring Pointer to the command  string.   The  RXFB
  11072. TOKEN  flag specifies that the command line is to be tokenized before  being
  11073. passed to the invoked program.  The RXFB_STRING flag bit indicates that  the
  11074. command  string  is  a "string file." Command invocations  do  not  normally
  11075. return  result strings,but the RXFB_RESULT flag can be set if the caller  is
  11076. prepared  to  handle  the cleanup associated with a  returned  string.   The
  11077. RXFB_NOIO  modifier  suppresses the inheritance  of  the  host's  input  and
  11078. output streams.
  11079.  
  11080. RXFUNC [RXFF_RESULT] [RXFF STRING] [RXFF_N010] argcount
  11081.  
  11082. This  command  code  specifies a function invoction.   Parameter  slot  ARGO
  11083. contains a pointer to the function name string,and slots ARGI through  ARG15
  11084. point to the argument strings,all of which must be passed as argstrings. The
  11085. lower byte of the command code is the argument count;this count excludes the
  11086. function  name  string itself.  Function calls normally set the  RXFB_RESULT
  11087. flag,but this is not mandatory.  The RXFB_STRING modifier indicates that the
  11088. function  name  string is actually a "string file".  The RXFB_NOIO  modifier
  11089. suppresses the inheritance of the host's input and output streams.
  11090.  
  11091. RXREMCON:  This code requests that an entry be removed from the  Clip  List.
  11092. Parameter  slot ARGO points to the null-terminated name to be removed.   The
  11093. Clip  List is searched for a node matching the supplied name,and if a  match
  11094. is  tound  the list node is removed and recycled.  If no match is found  the
  11095. packet is returned with a warning error code.
  11096.  
  11097. RXREMLIB:  This command removes a Library List entry.  Parameter  slot  ARGO
  11098. points  to the null terminated string specifying the library to be  removed.
  11099. The Library List is searched for a node matching the library name,and  if  a
  11100. match  is found the node is removed and released.  If no match is found  the
  11101. packet is returned with a warning error code. The libary node will
  11102.  
  11103. Page 207
  11104.  
  11105. not be removed if the library is currently being used by an ARexx program.
  11106.  
  11107. RXTCCLS:
  11108.  
  11109. This  code requests that the global tracing console be closed.  The  console
  11110. window  will  be  closed immediately unless one or more ARexx  programs  are
  11111. waiting for input from the console.  In this event,the window will be closed
  11112. as soon as the active programs are no longer using it.
  11113.  
  11114. RXTCOPN:
  11115.  
  11116. This  command requests that the global tracing console be opened.  Once  the
  11117. console  is open,all active ARexx programs will divert their tracing  output
  11118. to  the  console.   Tracing  input(for interactive  debugging)will  also  be
  11119. diverted  to  the  new  console.  Only one console can be  opened;subsequent
  11120. RXTCOPN requests will be returned with a warning error message.
  11121.  
  11122. MODIFIER FLAGS
  11123.  
  11124. Command  codes  may  include  modifier flags to  select  various  processing
  11125. options.   Modifier flags are specific to certain commands,and  are  ignored
  11126. otherwise.
  11127.  
  11128. RXFF_N010:
  11129.  
  11130. This  modifier is used with the RXCOMM and RXFUNC command codes to  suppress
  11131. the automatic inheritance of the host's input and output streams.
  11132.  
  11133. RXFF NONRET:
  11134.  
  11135. Specifies that the message packet is to be recycled by the resident  process
  11136. rather  than  being returned to the sender.  This implies  that  the  sender
  11137. doesn't  care  about  whether  the   requested  action  succeeded,since  the
  11138. returned  packet  provides the only means of acknowledgement.   (RXFF_NONRET
  11139. MUST NOT BE USED AT ANY TIME)
  11140.  
  11141. RXFF RESULT:
  11142.  
  11143. This modifer is valid with the RXCOMM and RXFUNC commands,and requests  that
  11144. the  called  program  return  a  result string.   If  the  program  EXITs(or
  11145. RETURNs)with an expression,the expression result is returned to  the  caller
  11146. as an argstring.  This ArgString then becomes the callers responsibility  to
  11147. release.  This is automatically accomplished by using GetResultString().  It
  11148. is  therefore  imperitive  that if you use RXFF_RESULT  then  you  must  use
  11149. GetResultString()  when the message packet is returned to you  or  you  will
  11150. incure a memory loss equal to the size of the ArgString Structure.
  11151.  
  11152. RXFF_STRING:
  11153.  
  11154. This  modifer  is  valid  with  the RXCOMM and  RXFUNC  command  codes.   It
  11155. indicates  that the command or function argument(in slot ARGO)is  a  "string
  11156. file" rather than a file name.
  11157.  
  11158. RXFF_TOKEN:
  11159.  
  11160. This  flag  is used with the RXCOMM code to request that the command  string
  11161. be  completely  tokenized  before  being  passed  to  the  invoked  program.
  11162. Programs  invoked as commands normally have only a single  argument  string.
  11163. The  tokenization  process uses "white space" to separate the  tokens,except
  11164. within quoted strings. Quoted strings can use either single or double
  11165.  
  11166. 208
  11167.  
  11168. quotes,and the end of the command string(a null character)  is considered as
  11169. an implicit closing quote
  11170.  
  11171. ReplyRexxMsg ReplyRexxMsg rexxmsg, Resultl, Result2, "ResultString "
  11172.  
  11173. When  ARexx  sends you a RexxMsg (Other than a reply to yours i.e.   sending
  11174. yours  back to you with results)  you must repl to the message before  ARexx
  11175. will  continue  or  free   that   memory   associated   with  that  RexxMsg.
  11176. ReplyRexxMsg accomplishes this for you.  ReplyRexxMsg also will  only  reply
  11177. to  message  that  requires a reply so you do not have  to  include  message
  11178. checking  routines in your source simply call ReplyRexxMsg on every  message
  11179. you receive wether it is a command or not.
  11180.  
  11181. The arguments are:
  11182.  
  11183. rexxmsg  is  the LONGWORD address of the RexxMsg Arexx sent you as  returned
  11184. by GetMsg_(Port).
  11185.  
  11186. Result1 is 0 or a severity value if there was an error.
  11187.  
  11188. Result2  is 0 or an Arexx error number if there was an error processing  the
  11189. command that was contained in the message.
  11190.  
  11191. ResultString is the result string to be sent back to Arexx.  This will  only
  11192. be sent if Arexx requested one and Resultl and 2 are 0.
  11193.  
  11194. ReplyRexxMsg rexxmsg,0,0,"THE RETURNED MESSAGE"
  11195.  
  11196. GetRexxResult() Resultl=GetRexxResult(rexxmsg,ResultNum)
  11197.  
  11198. GetRexxResult  extracts either of the two result numbers  from  the  RexxMsg
  11199. structure. Care must be taken with this Function to ascertain wether you are
  11200. dealing with error codes or a ResultString address.  Basically if  result  I
  11201. is zero then result 2 will either be zero or contain a ArgString pointer  to
  11202. the ResultString. This should then be obtained using GetResultString().
  11203.  
  11204. The arguments to GetRexxResult are;
  11205.  
  11206. rexxmsg is the LONGWORD address of a RexxMsg structure returned from ARexx.
  11207.  
  11208. ResultNum is either I or 2 depending on wether you wish to check result I or
  11209. result 2. GetRexxCommand (rexxmsg,ARGnum)
  11210.  
  11211. GetRexxCommand  allows you access to all 16 ArgString  slots  in  the  given
  11212. RexxMsg.   Slot  I contains the command string sent by ARexx  in  a  command
  11213. message so this allows you to extract the Command.
  11214.  
  11215. Arguments are:
  11216.  
  11217. Page 209
  11218.  
  11219. rexxmsg  is  a  LONGWORD  address of the RexxMsg structure  as  returned  by
  11220. RexxEvent()
  11221.  
  11222. AFGNum is an integer from I to 16 specifying the ArgString Slot you wish  to
  11223. get an ArgString from.
  11224.  
  11225. YOU MUST KNOW THAT THERE IS AN ARGSTRING THERE.
  11226.  
  11227. GetResultString (rexxmag)
  11228.  
  11229. GetResultString allows you to extract the result string returned to  you  by
  11230. ARexx after it has completed the action you requested.  ARexx will only send
  11231. back  a result string if you asked for one (using the ActionCodes)  and  the
  11232. requested action was successful.
  11233.  
  11234. Wait
  11235.  
  11236. Wait  halts all program execution until an event occurs that the program  is
  11237. interested in.  Any intuition event such as clicking on a gadget in a window
  11238. will start program execution again.
  11239.  
  11240. A message arriving at a MsgPort will also start program execution again.  So
  11241. you  may use Wait to wait for input from any source including messages  from
  11242. ARexx to your program.
  11243.  
  11244. Wait  should  always be paired with EVENT if you need to consider  intuition
  11245. events in your event handler loop.
  11246.  
  11247. RexxEvent (Port)
  11248.  
  11249. RexxEvent is our Arexx Equivalent of EVENT().  It's purpose is to check  the
  11250. given Port to see if there is a message waiting there for us.
  11251.  
  11252. It  should  be called atter a WAIT and will either return a NULL  to  us  if
  11253. there  was  no message or the LONG address of a RexxMsg Structure  if  there
  11254. was a message waiting.
  11255.  
  11256. Multiple  Arexx MsgPorts can be handled using separate calls to RexxEvent():
  11257. Wait:Rmsg I .I=RexxEvent(Port I ):Rmsg2.1=RexxEvent(Port2):etc
  11258.  
  11259. RexxEvent also takes care of automatically clearing the rexxmsg if it is our
  11260. message being returned to us.
  11261.  
  11262. The  argument  is  the   LONG   address   of   a   MsgPort  as  returned  by
  11263. CreateMsgPort().
  11264.  
  11265. IsRexxMsg (rexxmsg)
  11266.  
  11267. IsRexxMsg  tests  the argument (a LONGWORD pointer hopefully  to  a  message
  11268. packet)  to see if it is a RexxMsg Packet.  If it is TRUE is returned (1) or
  11269. FALSE if it is not (0).
  11270.  
  11271. As  the  test  is non destructive and extensive passing a NULL  value  or  a
  11272. LONGWORD  that  does not point to a Message structure (Intuition  or  Arexx)
  11273. will safely return as FALSE.
  11274.  
  11275. RexxError() ErrorString$=RexxError(ErrorCode)
  11276.  
  11277. RexxError  converts  a  numerical error code such  as  you  would  get  from
  11278. GetRexxResult(msg,2)  into an understandable string error message.   If  the
  11279. ErrorCode is not known to ARexx a string stating so is returned this ensures
  11280. that this function will always succeed.
  11281.  
  11282. Page 210
  11283.  
  11284. R-29: BREXX COMMANDS
  11285.  
  11286. The  Blitz  BRexx commands allow you to take control of certain  aspects  of
  11287. Intuition.  Through BRexx,  your programs can 'fool' Intuition into thinking
  11288. that the mouse has been played with,  or the keyboard has been used. This is
  11289. ideal  for giving your programs the ability to perform 'macros' - where  one
  11290. keystroke can set off a chain of pre-defined events.
  11291.  
  11292. The BRexx commands support tape objects.  These are predefined sequences  of
  11293. events  which may be played back at any time.  The convenient Record command
  11294. can be used to easily create tapes.  Using the MacroKey command,  tapes  may
  11295. also  be  attached to any keystroke to be played back instantly at the  push
  11296. of a button!
  11297.  
  11298. Please note that none of the BRexx commands are available in Blitz mode.
  11299.  
  11300. AbsMouse X,Y
  11301.  
  11302. AbsMouse  allows  you to position the mouse pointer at an  absolute  display
  11303. location.  The X parameter specifies how far across the display the  pointer
  11304. is  to  be  positioned,  while the Y parameter specifies how  far  down  the
  11305. display.  X must be in the range zero through 639.  Y must be in  the  range
  11306. zero through 399 for NTSC machines, or zero through 511 for PAL machines.
  11307.  
  11308. RelMouse X Offset, Y Offset
  11309.  
  11310. RelMouse allows you to move the mouse pointer a relative distance from  it's
  11311. current  location.   Positive  offset   parameters  will  move  the  pointer
  11312. rightwards  and downwards,  while negative offset parameters will  move  the
  11313. pointer leftwards and upwards.
  11314.  
  11315. MouseButton Button,Onl Off
  11316.  
  11317. MouseButton  allows  you to alter the status of the Amiga's  left  or  right
  11318. mouse buttons.  Button should be set to zero to alter the left mouse button,
  11319. or  one to alter the right mouse button.  On/Off refers to whether the mouse
  11320. button should be pressed (On) or released (Off).
  11321.  
  11322. ClickButton Button
  11323.  
  11324. ClickButton  is identical to executing two MouseButton commands  -  one  for
  11325. pressing the mouse button down,  and one for releasing it.  This can be used
  11326. for such things as gadget selection.
  11327.  
  11328. Type String$
  11329.  
  11330. Type  causes Intution to behave exactly as if a certain series  of  keyboard
  11331. characters had been entered. These are normally sent to the currently active
  11332. window.
  11333.  
  11334. Page 211
  11335.  
  11336. Record [Tape#]
  11337.  
  11338. Record  allows you to create a tape object.  Tape objects are  sequences  of
  11339. mouse and/or keyboard events which may be played back at any time.
  11340.  
  11341. When  a  tape# parameter is supplied to the Record command,  recording  will
  11342. begin.  From that point on, all mouse and keyboard activity will be recorded
  11343. onto the specified tape.
  11344.  
  11345. The Record command with no parameters will cause any recording to finish.
  11346.  
  11347. PlayBack [Tape#]
  11348.  
  11349. PlayBack begins playback of a previously created tape object.  When a  Tape#
  11350. parameter is supplied,  playback of the specified tape will commence.  If no
  11351. parameter is supplied,  any tape which may be in the process of being played
  11352. back will finish.
  11353.  
  11354. auickplay Onl Off
  11355.  
  11356. QuickPlay will alter the way tapes are played using the PlayBack command. If
  11357. QuickPlay is enabled by use of an On parameter,  then all PlayBack  commands
  11358. will cause tapes to be played with no delays between actions. This means any
  11359. pauses  which may be present in a tape (for instance,  delays between  mouse
  11360. movements) will be ignored when it is played back. QuickPlay Off will return
  11361. PlayBack  to  it's  default mode of including  all  tape  pauses.   This  is
  11362. sometimes  necessary when playing back tapes which must at some  point  wait
  11363. for disk access to finish before continuing.
  11364.  
  11365. PlayWait
  11366.  
  11367. PlayWait  may be used to halt program flow until a PlayBack of  a  tape  has
  11368. finished.
  11369.  
  11370. XStatus
  11371.  
  11372. XStatus  returns  a  value depending upon the current  state  of  the  BRexx
  11373. system. Possible return values and their meanings are as follows:
  11374.  
  11375.     0    BRexx is currently inactive. No tapes are either being recorded or
  11376.         played back.
  11377.     l    BRexx is currently in the process of recording a tape.
  11378.         This may be due to either the Record or TapeTrap commands.
  11379.     2    BRexx is currently playing a tape back.
  11380.  
  11381. SaveTape Tape#,Filename$
  11382.  
  11383. SaveTape  allows you to save a previously created tape object out  to  disk.
  11384. This tape may later be reloaded using LoadTape.
  11385.  
  11386. LoadTape Tape#,Filename$
  11387.  
  11388. LoadTape allows you to load a tape object previously saved with SaveTape for
  11389. use with the PlayBack command.
  11390.  
  11391. Page 212
  11392.  
  11393. TapeTrap [Tape#]
  11394.  
  11395. TapeTrap allows you to record a sequence of AbsMouse,  RelMouse, MouseButton
  11396. and ClickButton events to a tape object.
  11397.  
  11398. TapeTrap works similarly to Record, in that both commands are used to create
  11399. a tape.  However,  whereas Record receives information from the actual mouse
  11400. and  keyboard,  TapeTrap receives information from any AbsMouse,   RelMouse,
  11401. MouseButton  and ClickButton commands which may be executed.  TapeTrap  with
  11402. no parameter wil1 finish tape creation.
  11403.  
  11404. QuietTrap Onl Off
  11405.  
  11406. QuietTrap determines the way in which any TapeTrapping will be executed.
  11407.  
  11408. QuietTrap On will cause any AbsMouse,  RelMouse, MouseButton and ClickButton
  11409. commands to be recorded to tape,  but not to actually have any effect on the
  11410. porgram currently running.
  11411.  
  11412. QuietTrap  Off  will  cause  any   AbsMouse,    RelMouse,   MouseButton  and
  11413. ClickButton  commands  to be recorded to tape,  AND  to  cause  their  usual
  11414. effects. QuietTrap Off is the default mode.
  11415.  
  11416. MacroKey Tape#,Rawkey,Qualifier
  11417.  
  11418. MacroKey  causes  a  previously defined tape object  to  be  attached  to  a
  11419. particular keyboard key. RawKey and Qualifier define the key the tape should
  11420. be attached to.
  11421.  
  11422. FreeMacroKey Rawkey, Qualifier
  11423.  
  11424. FreeMacroKey causes a previously defined macro key to be removed so  that  a
  11425. BRexx tape is no longer attatched to it.
  11426.  
  11427. Page 213
  11428.  
  11429.  
  11430.  
  11431. R-30: SERIAL PORT COMMANDS
  11432.  
  11433. The  following are a set of commands to drive both the single  RS232  serial
  11434. port  on an Amiga as well as supporting multiserial port cards such  as  the
  11435. A2232 card.  The unit# in the following commands should be set to 0 for  the
  11436. standard RS232 port,  unit I refers to the default serial port  set  by  the
  11437. advanced  serial preferences program and unit 2 refer to  any  extra  serial
  11438. ports available.
  11439.  
  11440. OpenSerial device$,unit#,baud,io_serfiags
  11441.  
  11442. OpenSerial  is  used to configure a Serial Port for use.  As with  OpenFile,
  11443. OpenSerial  is  a  function and returns zero if it fails.   If  it  succeeds
  11444. advanced  users may note the return result is the location of  the  IOExtSer
  11445. structure.   The  device$  should be "serial.device"  or  compatible  device
  11446. driver.   The  baud  rate  should  be in  the  range  of  110-292,000.   The
  11447. io_serflags parameter can include the following flags:
  11448.  
  11449. #serf_xdisabled= 128    ;disable xon/xoff
  11450. #serf eofmode=64    ;enable eof checking
  11451. #serf_shared=32        ;set if you don't need exclusive use of port
  11452. #serf rad_boogie= 16    ;high speed mode
  11453. #serf_queuedbrk=8    ;if set a break command waits for buffer empty
  11454. #serf_7wire=4        ;if set use 7 wire RS232
  11455. #serf_parity_odd=2    ;select odd parity (even if not set)
  11456. #serf_parity_on= I    ;enable parity checking
  11457.  
  11458. WriteSerial unit#,byte
  11459.  
  11460. WriteSerial sends one byte to the serial port.  Unit# defines  which  serial
  11461. port  is  used.   If you are sending characters use the Asc()   function  to
  11462. convert the character to a byte e.g. WriteSerial 0,asc("b").
  11463.  
  11464. WriteSerialString unit#,string
  11465.  
  11466. WriteSerialString is similar to WriteSerial but sends a complete  string  to
  11467. the serial port.
  11468.  
  11469. ReadSerial (unit#J
  11470.  
  11471. ReadSerial  returns the next byte waiting in the serial port's read  buffer.
  11472. If  the  buffer  is empty it returns a -1.  It is best to use  a  word  type
  11473. (var.w=ReadSerial(0)) as a byte will not be able to differentiate between -1
  11474. and 255.
  11475.  
  11476. ReadSerialString (unit#)
  11477.  
  11478. ReadSerialString puts the serial port's read buffer into a string,   if  the
  11479. buffer is empty the function will return a null string (length=0).
  11480.  
  11481. Page 214
  11482.  
  11483. CloseSerial unit#
  11484.  
  11485. The CloseSerial command will close the port,  enabling other programs to use
  11486. it.  Note:  Blitz will automatically close all ports that are opened when  a
  11487. program ends.
  11488.  
  11489. SetSerialBuffer unit#,bufferlength
  11490.  
  11491. SetSerialBuffer  changes the size of the ports read  buffer.   This  may  be
  11492. useful  if  your  program is not always handling  serial  port  data  or  is
  11493. receiving  and processing large chunks of data.  The smallest size  for  the
  11494. internal serial port (unit#0)  is 64 bytes.  The bufferlength variable is in
  11495. bytes.
  11496.  
  11497. SetSerialLens unit#, readlen, writelen,stopOits
  11498.  
  11499. SetSerialLens allows you to change the size of characters read  and  written
  11500. by  the  serial  device.  Generally readlen=writelen and should  be  set  to
  11501. either 7 or 8, stopbits should be set to I or 2. Default values are 8,8,1.
  11502.  
  11503. SetSerialParams unit#
  11504.  
  11505. For  advanced users,  SetSerialParams tells the serial port when  parameters
  11506. are  changed  This  would only be necesary if they were  changed  by  poking
  11507. offsets from IOExtSer which is returned by the OpenSerial command.
  11508.  
  11509. SerialEvent (unit#)
  11510.  
  11511. SerialEvent is used when your program is handling events from  more  than  I
  11512. source, Windows, ARexx etc. This command is currently not implemented
  11513.  
  11514. ReadSerialMem Unit#,Address,Length
  11515.  
  11516. ReadSerialMem  will fill the given memory space with  data  from  the  given
  11517. serial port.
  11518.  
  11519. WriteSerial Mem Unit#,Address, Length
  11520.  
  11521. WriteSerialMem sends out the given memory space out the given serial port.
  11522.  
  11523. Page 215
  11524.  
  11525. APPENDIX 1: COMPILE TIME ERRORS
  11526.  
  11527. The  following  is a list of all the Blitz 2 compile time errors.   Blitz  2
  11528. will  print  these messages when unable to compile a line of your  code  and
  11529. fails.   The cursor will be placed on the line with the offending  error  in
  11530. most cases.
  11531.  
  11532. Sometimes  the  cause  of the error will not be directly  related  to  where
  11533. Blitz 2 ceased compiling.  Any reference to an include file or a macro could
  11534. mean the error is there and not on the line referenced.
  11535.  
  11536. General Syntax Errors
  11537.  
  11538. Syntax  Error:   Check for typing mistakes and check your  syntax  with  the
  11539. reference manual.
  11540.  
  11541. Garbage at End of Line:  A syntax error of sorts.  Causes are usually  typos
  11542. and  missing semi colons from the beginning of Remarks.  Also a .type suffix
  11543. when accessing NewType items will generate this error.
  11544.  
  11545. Numeric  Over  Flow:  The signed value is too large to fit in  the  variable
  11546. space provided,  if you need bytes to hold 0..255 rather than -128..127  etc
  11547. turn  off  Overflow checking in the runtime errors section  of  the  Options
  11548. requester.
  11549.  
  11550. Bad  Data:  The values following the Data.type statement are not of the same
  11551. type as precedes the Data statement.
  11552.  
  11553. Procedure Related Errors
  11554.  
  11555. Not  Enough  Parameters:  The command,  statement  or  function  needs  more
  11556. parameters.  Use the HELP key for correct number and meaning  of  parameters
  11557. with  Blitz][ commands and check Statement and Function definitions in  your
  11558. code.
  11559.  
  11560. Duplicate parameter variable:  Parmaters listed in statements and  functions
  11561. must be unique.
  11562.  
  11563. Too  many  parameters:  The statement or function was defined  needing  less
  11564. parameters than supplied by the calling routine.
  11565.  
  11566. Yllegal Parameter Type: NewTypes cannot be passed to procedures.
  11567.  
  11568. Illegal  Procedure return:  The statement or function return is syntatically
  11569. incorrect.
  11570.  
  11571. Illegal  End  Procedure:   The  statement or function  end  is  syntatically
  11572. incorrect.
  11573.  
  11574. Shared  outside  of  Procedure:  Shared variables  are  only  applicable  to
  11575. procedures.
  11576.  
  11577. Page 217
  11578.  
  11579. Variable already Shared: Shared variables must be unique in name.
  11580.  
  11581. Can't Nest Procedures: Procedures may NOT be defined within procedures, only
  11582. from the primary code.
  11583.  
  11584. Can't Dim Globals in Procedures:  Global arrays may be only defined from the
  11585. pumary code.
  11586.  
  11587. Can't  Goto/Gosub  a  Procedure:  Goto and Gosub must  always  point  to  an
  11588. existing part of the primary code.
  11589.  
  11590. Duplicate Procedure name:  A procedure (statement or function)  of the  same
  11591. name has been defined previously in the source.
  11592.  
  11593. Procedure  not  found:  The statement or function has  not  previously  been
  11594. defined in the source code.
  11595.  
  11596. Unterminated  Procedure:  The End Function or End  Statement  commands  must
  11597. terminate a procedure definition.
  11598.  
  11599. Illegal  Procedure  Call:  The statement or function  call  is  syntatically
  11600. incorrect.
  11601.  
  11602. Illegal Local Name: Not a valid variable name.
  11603.  
  11604. Constants Related Errors
  11605.  
  11606. Can't Assign Constant: Constant values can only be assigned to constants, no
  11607. variables please.
  11608.  
  11609. Constant  not  defined:  A constant (such as #num)   has  been  used  in  an
  11610. expression without first being defined
  11611.  
  11612. Constant already defined:  Constants can only be defined once,  i.e.  cannot
  11613. change their value through the code.
  11614.  
  11615. Illegal Constant: Same as can't assign constant
  11616.  
  11617. Fractions  Not  allowed in Constants:  Blitz 2 constants  can  only  contain
  11618. absolute values, they are usually rounded and no error is generated.
  11619.  
  11620. Can't Use Constant: Caused by a clash in constant name definitions.
  11621.  
  11622. Constant  Not  Found:  The Constant has not been defined previously  in  the
  11623. source code.
  11624.  
  11625. Illegal Constant Expression:  A constant may only hold whole numbers, either
  11626. a  decimal place,  text or a variable name has been included in the constant
  11627. definition.
  11628.  
  11629. Page 218
  11630.  
  11631. Expression Evaluation Errors
  11632.  
  11633. Can't  Assign  Expression:   The  expression  cannot  be  evaluated  or  the
  11634. evaluation has generated a value that is incompatible with the equate.
  11635.  
  11636. No Terminating Quote: Any text assigns should start and end with quotes.
  11637.  
  11638. Precedence  Stack  Overflow:  You have attained an  unprecedented  level  of
  11639. complexity  in  your  expression  and  the  Blitz  2  evaluation  stack  has
  11640. overflowed. A rare beast indeed!
  11641.  
  11642. Illegal Errors
  11643.  
  11644. Illegal Trap Vector: The 68000 has only 16 trap vectors.
  11645.  
  11646. Illegal Immediate Value:  An immediate value must be a constant and must  be
  11647. in range. See the 68000 appendix for immediate value ranges.
  11648.  
  11649. Iligeal  Absolute:  The Absolute location specified must be defined  and  in
  11650. range.
  11651.  
  11652. Illegal  Displacement:  The Displacement location specified must be  defined
  11653. and in range.
  11654.  
  11655. Illegal Assembler Instruction Size:  The Intstruction size is not available,
  11656. refer to the 68000 appendix for relevant instruction sizes.
  11657.  
  11658. Illegal Assembler Addressing Mode:  The addressing mode is not available for
  11659. that opcode, refer to the 68000 appendix for relevant addressing modes.
  11660.  
  11661. Library Based Errors
  11662.  
  11663. Illegal  TokeJsr  token  number:  Blitz 2 cannot find  the  library  routine
  11664. referred to by the TokeJsr command,  usually caused by the library not being
  11665. included  in  DefLibs,   not  present in the BlitzLibs:   directory  or  the
  11666. calculation being wrong (token number = libnumber* 128 + token offset).
  11667.  
  11668. Library not Found:  'library number': Blitz2 cannot find the library routine
  11669. referred to by a Token,  usually caused by the library not being'included in
  11670. DeflLibs or the library not present in the BlitzLibs: directories.
  11671.  
  11672. Token Not Found:  'token number':  When loading source, Blitz 2 replaces any
  11673. unfound  tokens with ?????,  compiling your code with these  unknown  tokens
  11674. present will generate the above error.
  11675.  
  11676. Page 219
  11677.  
  11678. Include Errors
  11679.  
  11680. Already Included:  The same source code has already been included previously
  11681. in the code.
  11682.  
  11683. Can't  open  Include:   Blitz 2 cannot find the  include  file,   check  the
  11684. pathname.
  11685.  
  11686. Error Reading File: DOS has generated an error during an include.
  11687.  
  11688. Program Flow Based Errors
  11689.  
  11690. Illegal Else in While Block:  See the reference section for the correct  use
  11691. of the Else command with While..Wend blocks.
  11692.  
  11693. Until  without Repeat:  Repeat..Until is a block directive and both must  be
  11694. present.
  11695.  
  11696. Repeat Block too large:  A Repeat..Until block is limited to 32000 bytes  in
  11697. length.
  11698.  
  11699. Repeat without Until:  Repeat..Until is a block directive and both  must  be
  11700. present.
  11701.  
  11702. If  Block too Large:  Blitz 2 has a limit of 32K for any blocks of code such
  11703. as IF..ENDIF blocks.
  11704.  
  11705. If Without End If:  The IF statement has two forms, if the THEN statement is
  11706. not  present then and END IF statment must be present to specify the end  of
  11707. the block.
  11708.  
  11709. Duplicate For...Next Error:  The same variable has been used for a For..Next
  11710. loop that is nested within another For..Next loop.
  11711.  
  11712. Bad Type for For...Next: The For..Next variable must be of numeric type.
  11713.  
  11714. Next without For:  FOR..NEXT is a block directive and both commands must  be
  11715. present.
  11716.  
  11717. For...Next Block to Long:  Blitz 2 restricts all blocks of code  to  32K  in
  11718. size.
  11719.  
  11720. For Without Next:  FOR..NEXT is a block directive and both commands must  be
  11721. present.
  11722.  
  11723. Page 220
  11724.  
  11725. Type Based Errors
  11726.  
  11727. Can't  Exchange  different lopes:  The Exchange command can  only  swap  two
  11728. variables of the same type.
  11729.  
  11730. Can't  Exchange NewTypes:  The Exchange command can not handle  NewTypes  at
  11731. present.
  11732.  
  11733. Type  too Big:  The unsigned value is too large to fit in the variable space
  11734. provided.
  11735.  
  11736. Mismatched  Types:   Caused  by  mixing   different  types  illegaly  in  an
  11737. evaluation.
  11738.  
  11739. [ype Mismatch: Same as Mismatched Types.
  11740.  
  11741. Can't  Compare Types:  Some Types are incompatible with operations  such  as
  11742. compares.
  11743.  
  11744. Can't  Convert Types:  The two Types are incompatible and  one  can  not  be
  11745. converted to the other.
  11746.  
  11747. Duplicate Offset (Entry)  Error:  The NewType has two entries  of  the  same
  11748. name.
  11749.  
  11750. Duplicated Type: A Type already exists with the same name.
  11751.  
  11752. End  NewType without NewType:  The NewType..End NewType is a block directive
  11753. and both must be present.
  11754.  
  11755. Type Not Found: No Type definition exists for the type referred to.
  11756.  
  11757. Illegal Type: Not a legal type for that function or statement.
  11758.  
  11759. Offset not Found: The offset has not been defined in the NewType definition.
  11760. Element isn't a pointer:  The variable used is not a *var type and so cannot
  11761. point to another variable.
  11762.  
  11763. Illegal Operator for Type: The operator is not suited for the type used.
  11764.  
  11765. Too  many  comma's in Let:  The NewType has less entries than the number  of
  11766. values listed after the Let.
  11767.  
  11768. Can't  use comma in Let:  The variable you are assigning multiple values  is
  11769. either  not  a  NewType and cannot hold multiple values or the  NewType  has
  11770. only one entry.
  11771.  
  11772. Illegal Function Type: A function may not return a NewType.
  11773.  
  11774. Page 221
  11775.  
  11776. Conditional Compiling Errors
  11777.  
  11778. CNIF/CSIF without CEND:  CNIF and CSIF are block directives and a CEND  must
  11779. conclude the block.
  11780.  
  11781. CEND  without  CNIF/CSIF...:  CNIF..CEND  is  a  block  directive  and  both
  11782. commands must be present.
  11783.  
  11784. Resident Based Errors
  11785.  
  11786. Clash  in Residents:  Residents being very unique animals,  must not include
  11787. the same Macro and Constant definitions.
  11788.  
  11789. Can't  Load Resident:  Blitz 2 cannot find the Resident file listed  in  the
  11790. Options requester. Check the pathname.
  11791.  
  11792. Macro Based Errors
  11793.  
  11794. Macro Buffer Overflow:  The Options requester in the Blitz 2 menu contains a
  11795. macro  buffer size,  increase if this error is ever reported.  May  also  be
  11796. caused by a recursive macro call which generates endless code.
  11797.  
  11798. Macro  already Defined:  Another macro with the same name has  already  been
  11799. defined,   may  have been defined in one of the included resident  files  as
  11800. well as somewhere in the source code.
  11801.  
  11802. Can't create Macro inside Macro: Macro definitions must occur in the primary
  11803. code.
  11804.  
  11805. Macro without End Macro: End Macro must end a Macro definition.
  11806.  
  11807. Macro  too  Big:   Macro's are limited to the buffer sizes  defined  in  the
  11808. Options requester.
  11809.  
  11810. Macros Nested too Deep:  Eight levels of macro nesting is available in Blitz
  11811. 2. Should never happen ! !
  11812.  
  11813. Macro not Found:  The macro has not been defined previous to the !macroname{
  11814. } call.
  11815.  
  11816. Array Errors
  11817.  
  11818. Illegal Array type: Should never happen.
  11819.  
  11820. Array  not  found:   A variable name followed by parenthises  has  not  been
  11821. previously defined as an array.  Other possible mistakes may be the  use  of
  11822. brackets instead of curly brackets for macro and procedure calls,   Blitz  2
  11823. thinking instead you are referring to an array name.
  11824.  
  11825. Page 222
  11826.  
  11827. Array is not a List:  A List function has been used on an array that was not
  11828. dimensioned as a List Array.
  11829.  
  11830. Illegal number of Dimensions: List arrays are limited to single dimensions.
  11831.  
  11832. Array already Dim'd: An array may not be re-dimensioned.
  11833.  
  11834. Can't Create Variable inside Dim:  An undefined variable has been used for a
  11835. dimension parameter with the Dim statement.
  11836.  
  11837. Array not yet Dim'd: See Array not found.
  11838.  
  11839. Array not Dim'd: See Array not found.
  11840.  
  11841. Interupt Based Errors
  11842.  
  11843. End SetInt without SetInt:  Setlnt..End SetInt is a block directive and both
  11844. commands must be present.
  11845.  
  11846. SetInt without End SetInt:  SetInt..End SetInt is a block directive and both
  11847. commands must be present.
  11848.  
  11849. Can't use SeVClrInt in Local Mode: Error handling can only be defined by the
  11850. primary code.
  11851.  
  11852. SetErr not allowed in Procedures:  Error handling can only be defined by the
  11853. primary code.
  11854.  
  11855. Can't use SeVClrlat in Local Mode: Error handling can only be defined by the
  11856. primary code.
  11857.  
  11858. End Setlnt without SetInt:  SetInt..End SetInt is a block directive and both
  11859. commands must be present.
  11860.  
  11861. Setlut without End SetInt:  Setlnt..End SetInt is a block directive and both
  11862. commands must be present.
  11863.  
  11864. Illegally nested Interrupts: Interrupt handlers can obviously not be nested.
  11865. Can't nest SetErr: Interrupt handlers can obviously not be nested.
  11866.  
  11867. End SetErr without SetErr:  SetErr..End SetErr is a block directive and both
  11868. must be present.
  11869.  
  11870. Illegal Interrupt Number:  Amiga interrupts are limited from O to 13.  These
  11871. interrupts are listed in the Amiga Hardware reference appendix.
  11872.  
  11873. Page 223
  11874.  
  11875. Label Errors Label reference out of context: Should never happen
  11876.  
  11877. Label  has been used as a Constant:  Labels and constants cannot  share  the
  11878. same name.
  11879.  
  11880. Illegal Label Name:  Refer to the Programming in Blitz2 chapter for  correct
  11881. variable nomenclature.
  11882.  
  11883. Duplicate  Label:  A label has been defined twice in the same  source  code.
  11884. May also occur with macros where a label is not preceded by a \@.
  11885.  
  11886. Label not Found: The label has not been defined anywhere in the source code.
  11887. Can't Access Label: The label has not been defined in the source code.
  11888.  
  11889. Direct Mode Errors
  11890.  
  11891. Cont  Option Disabled:  The Enable Continue option in the Runtime errors  of
  11892. the Options menu has been disabled.
  11893.  
  11894. Cont  only Available in Direct Mode:  Cont can not be called from your  code
  11895. only from the direct mode window.
  11896.  
  11897. Library  not  Available in Direct Mode:  The library is only available  from
  11898. within your code.
  11899.  
  11900. Illegal  direct mode command:  Direct mode is unable to execute the  command
  11901. entered.
  11902.  
  11903. Direct  Mode  Buffer  Overilow:  The ( )ptions menu contains  sizes  of  all
  11904. buffers,  if make smallest code is in effect extra buffer memory will not be
  11905. available for direct mode.
  11906.  
  11907. Can't Create in Direct Mode:  Variables cannot be created using direct mode,
  11908. only ones defined by your code are available.
  11909.  
  11910. Select... End Select Errors
  11911.  
  11912. Select  without End Select:  Select is a block directive and an  End  Select
  11913. must conclude the block.
  11914.  
  11915. End Select without Select:  Select..End Select is a block directive and both
  11916. must be present.
  11917.  
  11918. Default  without  Select:   The Default command  is  only  relevant  to  the
  11919. Select..End Select block directive.
  11920.  
  11921. Previous Case Block too Large:  A Case section in a Select block  is  larger
  11922. than 32K.
  11923.  
  11924. Page 224
  11925.  
  11926. Case  Without Select:  The Case command is only relevant to the  Select..End
  11927. Select block directive.
  11928.  
  11929. Blitz Mode Errors
  11930.  
  11931. Only  Available in Blitz mode:  The command is only available in Blitz mode,
  11932. refer to the reference section for Blitz/Amiga valid commands.
  11933.  
  11934. Only  Available in Amiga mode:  The command is only available in Amiga mode,
  11935. refer to the reference section for Blitz/Amiga valid commands.
  11936.  
  11937. Strange Beast Errors
  11938.  
  11939. Optimizer Error! - $': This should never happen. Please report.
  11940.  
  11941. Expression too Complex: Should never happen. Contact Mark directly.
  11942.  
  11943. Not Supported: Should never happen.
  11944.  
  11945. Illegal Token: Should never happen.
  11946.  
  11947. Page 225
  11948.  
  11949. APPENDIX 2: OPERATING SYSTEM CALLS
  11950.  
  11951. BLITZLIBS:AMIGALIBS currently supports the EXEC,  DOS,   GRAPHICS  INTUITION
  11952. and  DISKFONT amiga libraries.  Parameter details for each command are given
  11953. in brackets and are also available via the Blitz 2 keyboard help system.
  11954.  
  11955. Each call may be treated as either a command or a function.  Functions  will
  11956. always  return  a  long either containing true or false (signifying  if  the
  11957. command was successful or failed) or a value relevant to the routine.
  11958.  
  11959. The  relative  offsets from the library base and 68000  register  parameters
  11960. are  included for the convenience of the assembler programmer.   When  using
  11961. library calls an underscore character (_) should follow the token name.
  11962.  
  11963. An  asterisk  (*)   precedinu routine names specifies  that  the  calls  are
  11964. private and should not be called trom Blitz 2.
  11965.  
  11966. EXEC
  11967.  
  11968. -30 Supervisor(userFunction)(a5)
  11969. ---- special patchable hooks to internal exec activity ---
  11970. -36 *execPrivate1()()
  11971. -42 *execPrivate2()()
  11972. -48 *execPrivate3()()
  11973. -54 *execPrivate4()()
  11974. -60 *execPrivate5()()
  11975. -66 *execPrivate6()()
  11976. --- module creation ---
  11977. -72 InitCode(startClass,version)(dO/d1)
  11978. -78 InitStruct(initTable,memory,size)(a1/a2,dO)
  11979. -84 MakeLibrary(funcl nit,structl nit,libl nit,dataSize,segList)(aO/a1 /a2,dO/d 1)
  11980. -sO MakeFunctions(target,functionArray,funcDispBase)(aO/a1/a2)
  11981. -96 FindResident(name)(a1)
  11982. -102 InitResident(resident,segList)(a1,d1)
  11983. --- diagnoshcs ---
  11984. -108 Alert(alertNum)(d7)
  11985. -114 Debug(flags)(dO)
  11986. --- interrupts ---
  11987. -120 Disable()()
  11988. -126 Enable()()
  11989. -132 Forbid()()
  11990. -138 Permit()()
  11991. -144 SetSR(newSR,mask)(dO/d1)
  11992. -150 SuperState()()
  11993. -156 UserState(sysStack)(dO)
  11994. -162 SetlntVector(intNumber,interrupt)(dO/a1)
  11995. -168 AddlntServer(intNumber,interrupt)(dO/a1)
  11996. -174 RemintServer(intNumber,interrupt)(dO/a1)
  11997. -180 Cause(interrupt)(a1)
  11998. --- memory allocation ---
  11999. -186 Al locate (freeList, byteSize ) (aO, dO )
  12000. -192 Deallocate(freeList,memoryBlock byteSize)(aO/a1,dO)
  12001. -198 AllocMem(byteSize,requirementsj(dO/d1)
  12002. -204 AllocAbs(byteSize,location)(dO/a1)
  12003. -210 FreeMem(memoryBlock,byteSize)(a1,dO)
  12004. -216 AvailMem(requirements)(d1)
  12005. -222 AllocEntr,v(entr,v)(aO)
  12006.  
  12007. Page 227
  12008.  
  12009.  
  12010. -228 FreeEntry(entry)(aO)
  12011. --- lists ---
  12012. -234 Insert(list,node,pred)(aO/a1/a2)
  12013. -240 AddHead(list,node)(aO/a1)
  12014. -246 AddTail(list,node)(aO/a1)
  12015. -252 Remove(node)(a1)
  12016. -258 RemHead(list)(aO)
  12017. -264 RemTail(list)(aO)
  12018. -270 Enqueue(list,node)(aO/a1)
  12019. -276 FindName(list,name)(aO/a1)
  12020. --- tasks ---
  12021. -282 AddTask(task,initPC,finalPC)(a1/a2/a3)
  12022. -288 RemTask(task)(a1)
  12023. -294 FindTask(name)(a1)
  12024. -300 SetTaskPri(task,priority) (a 1,dO)
  12025. -306 SetSignal(newSignals,signalSet)(dO/d1)
  12026. -312 SetExcept(newSignals,signalSet)(dO/d1)
  12027. -318 Wait(signalSet)(dO)
  12028. -324 Signal(task,signalSet)(a1,dO)
  12029. -330 AllocSignal(signalNum)(dO)
  12030. -336 FreeSignal(signalNum)(dO)
  12031. -342 AllocTrap(trapNum)(dO)
  12032. -348 FreeT rap (trapN u m) (dO)
  12033. --- messages ---
  12034. -354 AddPort(port)(a1)
  12035. -360 RemPort(port)(a1)
  12036. -366 PutMsg(port,message)(aO/a1)
  12037. -372 GetMsa(port)(aO)
  12038. -378 ReplyMsg(message)(a1)
  12039. -384 WaitPort(port)(aO)
  12040. -390 FindPort(name)(a1)
  12041. --- libraries ---
  12042. -396 AddLibrary(library)(a1)
  12043. -402 RemLibrary(library)(a1)
  12044. -408 OldOpenLibrary(libName)(a1)
  12045. -414 CloseLibrary(library)(a1)
  12046. -420 SetFunction(library,funcOffset,newFunction)(a1,aO,dO)
  12047. -426 SumLibrary(library)(a1)
  12048. --- devices ---
  12049. -432 AddDevice(device)(a1)
  12050. -438 RemDevice(device)(a1)
  12051. -444 OpenDevice(devName,unit,ioRequest,flags)(aO,dO/a1,d1)
  12052. -450 CloseDevice(ioRequest)(a1)
  12053. -456 DolO(ioRequest)(a1)
  12054. -462 SendlO(ioRequest)(a1)
  12055. -468 ChecklO(ioRequest)(a1)
  12056. -474 WaitlO(ioRequest)(a1)
  12057. -480 AbortlO(ioRequest)(a1)
  12058. --- resources---
  12059. -486 AddResource(resource)(a1)
  12060. -492 RemResource(resource)(a1)
  12061. -498 OpenResource(resName)(a1)
  12062. --- private diagnostic support ---
  12063. -504 *execPrivate7()()
  12064. -510 *execPrivate8()()
  12065. -516 *execPrivate9()()
  12066. --- misc ---
  12067. -522 RawDoFmt(formatString,dataStream,putChProc, putChData)(aO/a1 /a2/a3)
  12068. -528 GetCC()()
  12069. -534 TypeOfMem(address)(a1)
  12070. -540 Procure(semaport,bidMsg)(aO/a1)
  12071. -546 Vacate(semaport)(aO)
  12072. -552 OpenLibrary(libName,version)(a1,dO)
  12073. *** functions in Release 1.2 or higher *^^
  12074. --- signal semaphores (note funny registers found in 1.2 or higher)---
  12075.  
  12076. Page 228
  12077.  
  12078.  
  12079. -558 InitSemaphore(sigSem)(aO)
  12080. -564 ObtainSemaphore(sigSem)(aO)
  12081. -570 Release Se maphore (si gSem) (aO)
  12082. -576 AttemptSemaphore(siqSem)(aO)
  12083. -582 ObtainSemaphoreListtsigSem)(aO)
  12084. -588 ReleaseSemaphoreList(sigSem)(aO)
  12085. -594 FindSemaphore(sigSem)(a1)
  12086. -600 AddSemaphore(sigSem)(a1)
  12087. -606 RemSemaphore(sigSem)(al)
  12088. --- kickmem support ---
  12089. -612 SumKickData()()
  12090. --- more memory support---
  12091. -618 AddMemList(size,attributes,pri,base,name)(dO/d1/d2/aO/al )
  12092. -624 CopyMem(source dest,size)(aO/a1 dO)
  12093. -630 CopyMemQuick(source,dest,size)(aO/a1,dO)
  12094. *** functions in Release 2.0 or higher'''
  12095. --- cache ---
  12096. -636 CacheClearU()()
  12097. -642 CacheClearE(address,length,caches)(aO dO/d1)
  12098. -648 CacheControl(cacheBits,cacheMask)(dOid1)
  12099. --- misc ---
  12100. -654 CreatelORequest(port,size)(aO,dO)
  12101. -660 DeletelORequest(iorequest)(aO)
  12102. -666 CreateMsgPort()()
  12103. -672 DeleteMsgPort(port)(aO)
  12104. -678 ObtainSemaphoreShared(sigSem)(aO)
  12105. --- even more memory support ---
  12106. -684 AllocVec(byteSize,requirements)(dO/d1)
  12107. -690 FreeVec(memoryBlock)(a1)
  12108. -696 CreatePrivatePool(requirements,puddleSize,puddleThresh)(dO/d1/d2)
  12109. -702 Delete Private Pool ( pool H ead er) (aO)
  12110. -708 AllocPooled(memSize,poolHeader)(dO/aO)
  12111. -714 FreePooled(memory,poolHeader)(a1,aO)
  12112. --- misc ---
  12113. -720 AttemptSemaphoreShared(sigSem)(aO)
  12114. -726 ColdReboot()()
  12115. -732 StackSwap(newStack)(aO)
  12116. --- task trees ---
  12117. -738 ChildFree(tid)(dO)
  12118. -744 ChildOrphan(tid)(dO)
  12119. -750 ChildStatus(tid)(dO)
  12120. -756 ChildWait(tid)(dO)
  12121. --- future expansion ---
  12122. -762 CachePreDMA(address,length,flags)(aO/a1,d1)
  12123. -768 CachePostDMA(address,length,flags)(aO/a1,d1)
  12124. -774 *execPrivate10()()
  12125. -780 *execPrivate11 ()()
  12126. -786 *execPrivate12()()
  12127. -792 *execPrivate13()()
  12128.  
  12129. DOS
  12130. -30 Open(name,accessMode)(d1/d2)
  12131. -36 Close(file)(d1)
  12132. -42 Read(file,buffer,length)(d1/d2/d3)
  12133. -48 Write(file,buffer,length)(d 1 /d2/d3)
  12134. -54 input()()
  12135. -60 Output()()
  12136. -66 Seek(file,position ,offset)(d 1 /d2/d3)
  12137. -72 DeleteFile(name)(d1)
  12138. -78 Rename(oldName,newName)(d1/d2)
  12139. -84 Lock(name,type)(d1/d2)
  12140. -90 UnLock(lock)(d1)
  12141. -96 DupLock(lock)(d1)
  12142. -102 Examine(lock,filelnfoBlock)(d1/d2)
  12143.  
  12144. Page 229
  12145.  
  12146.  
  12147. -108 ExNext(lock,filelnfoBlock)(d1 /d2)
  12148. -114 Info(lock,parameterBlock)(dl/d2)
  12149. -120 CreateDir(name)(d1)
  12150. -126 CurrentDir(lock)(d1)
  12151. -132 loErr()()
  12152. -138 CreateProc(name,pri,segList,stackSize)(d1/d2/d3/d4)
  12153. -144 Exit(returnCode)(d1)
  12154. -150 LoadSeg(name)(d1)
  12155. -156 UnLoadSeg(seglist)(d1)
  12156. -162 *dosPrivatel ()()
  12157. -168 *dosPrivate2()()
  12158. -174 DeviceProc(name)(d1)
  12159. -180 SetComment(name,comment)(d1/d2)
  12160. -186 SetProtection(name,protect)(d1/d2)
  12161. -192 DateStamp(date)(d1)
  12162. -198 Delay(timeout)(d1)
  12163. -204 WaitForChar(file,timeout)(d1/d2)
  12164. -210 ParentDir(lock)(d1)
  12165. -216 Isinteractive(file)(dl)
  12166. -222 Execute(string,file,file2)(d1/d2/d3)
  12167. ***functions in Release 2.0 or higher'''
  12168. ---DOS Object creation/deletion---
  12169. -228 AllocDosObject(type,tags)(d1/d2)
  12170. -234 FreeDosObject(type,ptr)(d 1 /d2)
  12171. ---Packet Level routines---
  12172. -240 DoPkt(port,action,arg1,arg2,arg3,arg4,arg5)(d1/d2/d3/d4/d5/d6/d7)
  12173. -246 SendPkt(dp,port,replyport)(d1/d2/d3)
  12174. -252 WaitPkt()()
  12175. -258 ReplyPkt(dp,res1 res2)(d1 /d2/d3)
  12176. -264 AbortPkt(port,pktj(d1/d2)
  12177. ---Record Locking---
  12178. -270 LockRecord(fh,offset,length,mode,timeout)(d1/d2/d3/d4/d5)
  12179. -276 LockRecords(recArray,timeout)(d1/d2)
  12180. -282 UnLockRecord(fh,offset,length)(d1/d2/d3)
  12181. -288 UnLockRecords(recArray)(d1)
  12182. ---Buffered File l/O---
  12183. -294 Selectlnput(fh)(d1)
  12184. -300 SelectOutput(fh)(d1)
  12185. -306 FGetC(fh)(d1)
  12186. -312 FPutC(fh,ch)(d1/d2)
  12187. -318 UnGetC(fh,character) (d 1 /d2)
  12188. -324 FRead(fh,block,blocklen,number)(d1/d2/d3/d4)
  12189. -330 FWrite(fh,block,blocklen,number)(d1/d2/d3/d4)
  12190. -336 FGets(fh,buf,buflen)(d1/d2/d3)
  12191. -342 FPuts(fh,str)(d1/d2)
  12192. -348 VFWritef(fh,format,argarray)(d 1 /d2/d3)
  12193. -354 VFPrinff(fh,format,argarray)(d 1 /d2/d3)
  12194. -360 Flush(fh)(d1)
  12195. -366 SetVBuf(fh,buff,type,size) (d 1 /d2/d3/d4)
  12196. ---DOS Object Management---
  12197. -372 DupLockFromFH(fh)(d1)
  12198. -378 OpenFromLock(lock)(d1)
  12199. -384 ParentOfFH(fh)(d1)
  12200. -390 ExamineFH(fh,fib)(d1/d2)
  12201. -396 SetFileDate(name,date)(d1/d2)
  12202. -402 NameFromLock(lock,buffer,len)(d 1 /d2/d3)
  12203. -408 NameFromFH(fh,buffer,len)(d1/d2/d3)
  12204. -414 SplitName(name,seperator buf,oldpos,size)(d1/d2/d3/d4/d5)
  12205. -420 SameLock(iock1,iock2)(d1id2)
  12206. -426 SetMode(fh,mode)(d1/d2)
  12207. -432 ExAll(lock,buffer,size,data,control)(d1/d2/d3/d4/d5)
  12208. -438 Read Li nk(port, lock , path , buffe r,size) (d 1 Id21d31d41d5 )
  12209. -444 MakeLink(name,dest,soft) (d 1 /d21d3)
  12210. -450 ChangeMode(type,fh,newmode)(d1/d2/d3)
  12211. -456 SetFileSize(f h,pos,mode)(d 1 /d2/d3)
  12212.  
  12213. Page 230
  12214.  
  12215.  
  12216. ---Error Handling---
  12217. -462 SetloErr(result)(d1)
  12218. -468 Fault(code,header,buffer,len)(d 1 /d21d3/d4)
  12219. -474 PrintFault(code,header)(d1/d2)
  12220. -480 ErrorReport(code,type,arg 1,device)(d 1 /d2/d3/d4)
  12221. -486 RESERVED
  12222. ---Process Management---
  12223. -492 Cli()()
  12224. -498 CreateNewProc(tags)(d1)
  12225. -504 RunCommand(seg,stack,paramptr,paramlen)(d1/d2/d3/d4)
  12226. -510 GetConsoleTask()()
  12227. -516 SetConsoleTask(task)(d1)
  12228. -522 GetFileSysTask()()
  12229. -528 SetFileSysTask(task)(d1)
  12230. -534 GetArgStr()()
  12231. -540 SetArgStr(string)(d1)
  12232. -546 FindCliProc(num)(d1)
  12233. -552 MaxCli()()
  12234. -558 SetCurrentDirName(name)(d1)
  12235. -564 GetCurrentDirName(buf,len)(d1/d2)
  12236. -570 SetProgramName(name)(d1)
  12237. -576 GetProgramName(buf,len)(d 1 /d2)
  12238. -582 SetPrompt(name)(d1)
  12239. -588 GetPrompt(buf,len)(d1/d2)
  12240. -594 SetProgramDir(lock)(d1)
  12241. -600 GetProgramDir()()
  12242. ---Device List Management---
  12243. -606 SystemTaqList(command tags)(d1/d2)
  12244. -612 AssignLock(name,lock)(di /d2)
  12245. -618 AssignLate(name,path)(d1 /d2)
  12246. -624 AssignPath(name,path)(d1/d2)
  12247. -630 AssignAdd(name,lock)(d1/d2)
  12248. -636 RemAssignList(name,lock)(d1/d2)
  12249. -642 GetDeviceProc(name dp)(d1/d2)
  12250. -648 Free Device Proc(dp)(di )
  12251. -654 LockDosList(flags)(d1)
  12252. -660 UnLockDosList(flags)(d1)
  12253. -666 AttemptLockDosList(flags)(d1)
  12254. -672 RemDosEntry(dlist)(d1)
  12255. -678 AddDosEntry(dlist)(d1)
  12256. -684 FindDosEntry(dlist,name,flags)(d1/d2/d3)
  12257. -690 NextDosEntry(dlist,flags)(d1/d2)
  12258. -696 MakeDosEntry(name,type)(d1/d2)
  12259. -702 FreeDosEntry(dlist)(d1)
  12260. -708 IsFileSystem(name)(d1)
  12261. ---Handler Interface---
  12262. -714 Format(filesystem,volumename,dostype)(d1/d2/d3)
  12263. -720 Relabel(drive,newname)(d1/d2)
  12264. -726 Inhibit(name onoff)(d1/d2)
  12265. -732 AddBuffers(name,number)(d 1 /d2)
  12266. ---Date, Time Routines---
  12267. -738 CompareDates(date1,date2)(d1/d2)
  12268. -744 DateToStr(datetime)(d1)
  12269. -750 StrToDate(datetime)(d1)
  12270. ---Image Management---
  12271. -756 InternalLoadSeg(f h ,table,funcarray,stack)(dO/aO/a1 /a2)
  12272. -762 InternalUnLoadSeg(seglist,freefunc)(d1/a1)
  12273. -768 NewLoadSeg(fiie,tags)(d1/d2)
  12274. -774 Add Segment(name, seg, system ) (d 1 /d2/d3)
  12275. -780 FindSegment(name,seg,system)(d1/d2/d3)
  12276. -786 RemSegment(seg)(d1)
  12277. ---Command Support----
  12278. -792 CheckSignal(mask)(d1)
  12279. -798 ReadArgs(template,array,args)(d1/d2/d3)
  12280. -804 FindArg(keyword,template)(d1/d2)
  12281.  
  12282. Page 231
  12283.  
  12284.  
  12285. -810 Readltem(name,maxchars,cSource)(d1/d2/d3)
  12286. -816 StrToLong(string,value)(d1 /d2)
  12287. -822 MatchFirst(pat,anchor)(d1/d2)
  12288. -828 MatchNext(anchor)(d1)
  12289. -834 MatchEnd(anchor)(d1)
  12290. -840 Parse Patte rn (pat, buf, bufl en ) (d 1 /d 2/d3)
  12291. -846 Match Patte rn (pat, str) (d 1 /d2)
  12292. -852 * Not currently implemented.
  12293. -858 FreeArgs(args)(d1)
  12294. -864'--- (1 function slot reserved here) ---
  12295. -870 FilePart(path)(d1)
  12296. -876 PathPart(path)(d1)
  12297. -882 AddPart(dirname,filename,size)(d1/d2/d3)
  12298. ---Notification---
  12299. -888 StartNotify(notify)(d1)
  12300. -894 EndNotify(notify)(d1)
  12301. ---Environment Variable functions---
  12302. -900 SetVar(name buffer,size,flags)(d1/d2/d3/d4)
  12303. -906 GetVar(name buffer,size,flags)(d1/d2/d3/d4)
  12304. -912 DeleteVar(name,flags)(d1/d2)
  12305. -918 FindVar(name,type)(d1/d2)
  12306. -924 *dosPrivate4()()
  12307. -930 ClilnitNewcli(dp)(aO)
  12308. -936 ClilnitRun(dp)(aO)
  12309. -942 WriteChars(buf,buflen)(d 1 /d2)
  12310. -948 PutStr(str)(d1)
  12311. -954 VPrinff(format,argarray)(d 1 /d2)
  12312. -960 *--- (1 function slot reserved here) ---
  12313. -966 ParsePatternNoCase(pat,buf,buflen)(d1/d2/d3)
  12314. -972 MatchPatternNoCase(pat,str)(d1/d2)
  12315. -978 dosPrivate5()()
  12316. -984 SameDevice(lock1,1Ock2)(d1/d2)
  12317.  
  12318. GRAPHICS
  12319.  
  12320. -30 BltBitMap
  12321. (srcBitMap,xSrc,ySrc,destBitMap,xDest,yDest,xSizelySizelminterm,mask,tempA)
  12322. (aO,dO/d 1 /a1,d2/d3/d4/d5/d6/d7/a2)
  12323. -36
  12324. BltTemplate(source,xSrc,srcMod,destRP,xDest,yDest,xSizelySize)(aO,dO/d1 /a1,d2/d3/d4/dS)
  12325. --- Text routnes ---
  12326. -42 ClearEOL(rp)(a1)
  12327. -48 ClearScreen(rp)(a1)
  12328. -54 TextLength(rp,string,count)(a1,aO,dO)
  12329. -60 Text(rp,string,count)(a1,aO,dO)
  12330. -66 SetFont(rp,textFont)(a1,aO)
  12331. -72 OpenFont(textAttr)(aO)
  12332. -78 CloseFont(textFont)(a1)
  12333. -84 AskSoflStyle(rp)(a1)
  12334. -90 SetSoffStyle(rp,style,enable)(a1,dO/d1)
  12335. --- Gels routnes ---
  12336. -96 AddBob(bob,rp)(aO/a1)
  12337. -102 AddVSprite(vSprite,rp)(aO/a1)
  12338. -108 DoCollision(rp)(a1)
  12339. -114 DrawGList(rp,vp)(a1,aO)
  12340. -120 InitGels(head,tail,gelsinfo)(aO/a1/a2)
  12341. -126 initMasks(vSprite)(a0)
  12342. -132 RemlBob(bob,rp,vp)(aO/a1/a2)
  12343. -138 RemVSprite(vSprite)(aO)
  12344. -144 SetCollision(num,routine,gelsinfo)(dO/aO/a1)
  12345. -150 SortGList(rp)(a1)
  12346. -156 AddAnimOb(anOb,anKey,rp)(aO/a1 /a2)
  12347. -162 Animate(anKey,rp)(aO/a1)
  12348. -168 GetGBuffers(anOb,rp,flag)(aO/a1,dO)
  12349.  
  12350. Page 232
  12351.  
  12352.  
  12353. -174 InitGMasks(anOb)(aO)
  12354. --- General graphics routines ---
  12355. -180 DrawEllipse(rp,xCenter,yCenter,a,b)(a1,dO/d1/d2/d3)
  12356. -186 AreaEllipse(rp,xCenter,yCenter,a,b)(a1,dO/d1 /d2/d3)
  12357. -192 LoadRGB4(vp,colors,count)(aO/a1,dO)
  12358. -198 InitRastPort(rp)(a1)
  12359. -204 InitVPort(vp)(aO)
  12360. -210 MrgCop(view)(a1)
  12361. -216 MakeVPort(view,vp)(aO/a1)
  12362. -222 LoadView(view)(a1)
  12363. -228 WaitBlit()()
  12364. -234 SetRast(rp,pen)(a1,dO)
  12365. -240 Move(rp,x,y)(a1,dO/d1)
  12366. -246 Draw(rp,x,y)(a1,dO/d1)
  12367. -252 AreaMove(rp x y)(a1 dO/d1)
  12368. -258 AreaDraw(rp x y)(a1 dO/d1)
  12369. -264 AreaEnd(rp)(a1)
  12370. -270 WaitTOF()()
  12371. -276 QBlit(blit)(al )
  12372. -282 InitArea(arealnfo,vectorBuffer maxVectors)(aO/al,dO)
  12373. -288 SetRGB4(vp,index,red,green,blue)(aO,dOld11d21d3)
  12374. -294 QBSBlit(blit)(a1)
  12375. -300 BltClear(memBlock,byteCount,flags)(a1,dO/d1)
  12376. -306 RectFill(rp,xMin,yMin,xMax,yMax)(a1,dO/d1/d2/d3)
  12377. -312 BltPattern(rp,mask xMin,yMin,xMax,yMax,maskBPR)(a1,aO,dO/d1 /d2/d3/d4)
  12378. -318 ReadPixel(rp,x,y)(a1,dO/d1)
  12379. -324 WritePixel(rp,x,y)(a1,dO/d1)
  12380. -330 Flood(rp,mode,x,y)(a1,d2,dO/d1)
  12381. -336 PolyDraw(rp,count,polyTable)(al,dO/aO)
  12382. -342 SetAPen(rp,pen)(al,dO)
  12383. -348 SetBPen(rp,pen)(a1,dO)
  12384. -354 SetDrMd(rp,drawMode)(a1,dO)
  12385. -360 InitView(view)(a1)
  12386. -366 CBump(copList)(a1)
  12387. -372 CMove(copList,destination,data)(a1,dO/d1)
  12388. -378 CWait(copList v,h)(a1,dO/d1)
  12389. -384 VBeamPos()(j
  12390. -390 InitBitMap(bitMap,depth,width,height)(aO,dO/d1/d2)
  12391. -396 ScrollRaster(rp,dx,dy,xMin,yMin,xMax,yMax)(a1,dO/d1/d2/d3/d4/d5)
  12392. -402 WaitBOVP(vp)(aO)
  12393. -408 GetSprite(sprite,num)(aO,dO)
  12394. -414 FreeSprite(num)(dO)
  12395. -420 ChanueSprite(vp,sprite,newData)(aO/a1/a2)
  12396. -426 MoveSprite(vp,sprite,x,y)(aO/a1,dO/d1)
  12397. -432 LockLayerRom(layer) (a5)
  12398. -438 UnlockLayerRom(layer)(a5)
  12399. -444 SyncSBitMap(layer)(aO)
  12400. -450 CopySBitMap(layer)(aO)
  12401. -456 OwnBlitter()()
  12402. -462 DisownBlitter()()
  12403. -468 InitTmpRas(tmpRas,buffer,size)(aO/al,dO)
  12404. -474 AskFont(rp ,textAttr) (al ,aO)
  12405. -480 AddFont(textFont)(a1)
  12406. -486 RemFont(textFont)(a1)
  12407. -492 AllocRaster(width,height) (dO/d 1)
  12408. -498 FreeRaster(p,width,height)(aO,dO/d1)
  12409. -504 AndRectRegion(region,rectangle)(aO/a1)
  12410. -510 OrRectRegion(region,rectangle)(aO/a1)
  12411. -516 NewRegion()()
  12412. -522 ClearRectRegion(region,rectangle)(aO/a1)
  12413. -528 ClearRegion(region)(aO)
  12414. -534 Di spos e Reg i on ( region ) (aO)
  12415. -540 FreeVPortCopLists(vp)(aO)
  12416. -546 FreeCopList(copList)(aO)
  12417.  
  12418. Page 233
  12419.  
  12420.  
  12421. -552
  12422. ClipBlit(srcRP,xSrc,ySrc,destRP,xDest,yDest,xSizelySizelminterm)(aO,dO/d1/a1,d2/d3/d4/d5/d6)
  12423. -558 XorRectRegion(region,rectangle)(aO/a1)
  12424. -564 FreeCprList(cprList)(aO)
  12425. -570 GetColorMap(entries)(dO)
  12426. -576 FreeColorMap(colorMap)(aO)
  12427. -582 GetRGB4(colorMap,entry)(aO,dO)
  12428. -588 ScrollVPort(vp)(aO)
  12429. -594 UCopperListlnit(uCopList,n)(aO dO)
  12430. -600 FreeGBuffers(anOb,rp,flag)(aOial,dO)
  12431. -606 BltBitMapRastPort(stcBM,x,y,destRP,x,y,Wld,Height,minterm)(aO,dO/d1/al,d2/d3/d4/d5/d6)
  12432. -612 OrRegionRegion(srcRegion,destRegion)(aO/a1)
  12433. -618 XorRegionRegion(srcRegion,destRegion)(aO/a1)
  12434. -624 AndRegionRegion(srcRegion,destRegion)(aO/a1)
  12435. -630 SetRGB4CM(colorMap,index,red,green,blue)(aO,dO/d1/d2/d3)
  12436. -636 BltMaskBitMapRastPort
  12437.  
  12438.     (srcBM,x,y,destRP,x,y,Wid,High,mterm,Mask)(aO,dO/d1/a1,d2/d3/d4/d5/d6/a2)
  12439. -642 RESERVED
  12440. -648 RESERVED
  12441. -654 AttemptLockLayerRom(layer)(a5)
  12442. *** functions in Release 2.0 or higher *-A
  12443. -660 GfxNew(gfxNodeType)(dO)
  12444. -666 GfxFree(gfxNodePtr)(aO)
  12445. -672 GfxAssociate(associateNode,gfxNodePtr)(aO/a1)
  12446. -678 BitMapScale(bitScaleArgs)(aO)
  12447. -684 ScalerDiv(factor,numerator,denominator)(dO/d1/d2)
  12448. -690 TextFit
  12449. (rp,string,strLen,textExtent,constrainingExtent,strDirection,constrainingBitWidth,constrainingBitH
  12450. eight)(a1,aO,dO/a2)
  12451.  
  12452. INTUITION
  12453.  
  12454. -30 Openintuition()()
  12455. -36 Intuition(iEvent)(aO)
  12456. -42 AddGadget(window,gadget,position)(aO/a1,dO)
  12457. -48 ClearDMRequest(window)(aO)
  12458. -54 ClearMenuStrip(window)(aO)
  12459. -60 ClearPointer(window) (aO)
  12460. -66 CloseScreen(screen)(aO)
  12461. -72 CloseWindow(window)(aO)
  12462. -78 CloseWorkBench()()
  12463. -84 CurrentTime(seconds,micros)(aO/a1)
  12464. -90 DisplayAlert(alertNumber,string,height)(dO/aO,d1)
  12465. -96 DisplayBeep(screen)(aO)
  12466. -102 DoubleClick(sSeconds,sMicros,cSeconds,cMicros)(dO/d1/d2/d3)
  12467. - 108 DrawBorder(rp, border,leftOffset,topOffset)(aO/a 1,dO/d 1)
  12468. -114 Drawlmage(rp,image,leftOffset topOffset)(aO/a1,dO/d1)
  12469. -120 EndRequest(requester,windowj(aO/a1)
  12470. -126 GetDefPrefs(preferences,size)(aO,dO)
  12471. -132 GetPrefs(preferences,size)(aO,dO)
  12472. -138 InitRequester(requester)(aO)
  12473. -144 ItemAddress(menuStrip,menuNumber)(aO,dO)
  12474. -150 ModifylDCMP(window,flags)(aO,dO)
  12475. -156 ModifyProp
  12476. (gadget,window, requester,flags,horizPot, vertPot,horizBody,vertBody)(aO/a1 /a2,dO/d 1 /d2/d3/d4)
  12477. -162 MoveScreen(screen,dx dy)(aO,dO/d1)
  12478. -168 MoveWindow(window,dx,dy)(aO,dO/d1)
  12479. -174 OffGadget(gadget,window,requester)(aO/a1 /a2)
  12480. -180 OffMenu(window,menuNumber)(aO,dO)
  12481. -186 OnGadget(gadget,window,requester)(aO/a1 /a2)
  12482. -192 OnMenu(window,menuNumber)(aO,dO)
  12483. -198 OpenScreen(newScreen)(aO)
  12484. -204 OpenWindow(newWindow) (aO)
  12485. -210 OpenWorkBench()()
  12486.  
  12487. Page 234
  12488.  
  12489.  
  12490. -216 PrintlText(rp,iText,left,top)(aO/a1,dO/d1)
  12491. -222 RefreshGadgets(gadgets,window,requester)(aO/a1/a2)
  12492. -228 RemoveGadget(window,gadget)(aO/a1 )
  12493. -234 ReportMouse(flag,window)(dO/aO)
  12494. -240 Request(requester,window)(aO/a1 )
  12495. -246 ScreenToBack(screen)(aO)
  12496. -252 ScreenToFront(screen)(aO)
  12497. -258 SetDMRequest(window,requester) (aO/a1 )
  12498. -264 SetMenuStrip(window,menu)(aO/a1 )
  12499. -270 SetPointer(window,pointer,height,width,xOffset,yOffset)(aO/al,dO/d1/d2/d3)
  12500. -276 SetWindowTitles(window,windowTitle,screenTitle) (aO/a1 /a2)
  12501. -282 ShowTitle(screen showlt)(aO,dO)
  12502. -288 SizeWindow(winjow,dx,dy)(aO,dO/d1)
  12503. -294 ViewAddress()()
  12504. -300 ViewPortAddress(window)(aO)
  12505. -306 WindowToBack(window)(aO)
  12506. -812 WindowToFront(window)(aO)
  12507. -318 WindowLimits(window,widthMin,heightMin,widthMax,heightMax)(aO,dO/d1/d2/d3)
  12508. -324 SetPrefs(preferences size,inform)(aO,dO/d1 )
  12509. -330 I ntuiTextLength(iTextj(aO)
  12510. -336 WBenchToBack()()
  12511. -342 WBenchToFront()()
  12512. -348
  12513. AutoRequest(window, body, posText,negText, p Flag,nFlag,width,height) (aO/a1 la2/a3,dO/d 1 /d2/d3)
  12514. -354 BeginRef resh(window)(aO)
  12515. -360 BuildSysRequest(window,body,posText,negText,flags,width,height)(aO/a1/a2/a3,dO/d1/d2)
  12516. -366 End Refresh (wi ndow , complete) (aO , dO)
  12517. -372 FreeSvsRequest(window)(aO)
  12518. -378 MakeScreen(screen)(aO)
  12519. -384 RemakeDisplay()()
  12520. -390 RethinkDisplay()()
  12521. -396 AllocRemember(rememberKey,size,flags)(aO,dO/d1)
  12522. -402 AlohaWorkbench(wbport)(aO)
  12523. -408 FreeRemember(rememberKey,reallyForget)(aO,dO)
  12524. -414 Lock l Base (dontknow) (dO )
  12525. -420 UnlocklBase(ibLock)(aO)
  12526. *** functions in Release 1.2 or higher ***
  12527. -426 GetScreenData(buffer,size,type,screen)(aO,dO/d1/a1)
  12528. -432 RefreshGList(gadgets,window,requester,numGad)(aO/a1/a2,dO)
  12529. -438 AddGList(window,gadget,position,numGad,requester)(aO/a1,dO/d1/a2)
  12530. -444 RemoveGList(remPtr,gadget,numGad)(aO/a1,dO)
  12531. -450 ActivateWindow(window)(aO)
  12532. -456 RefreshWindowFrame(window)(aO)
  12533. -462 ActivateGadget(gadgets,window,requester)(aO/a1/a2)
  12534. -468 NewModifyProp
  12535. (gadget,window,requester,flags,horizPot,vertPot,horizBody,vertBody,numGad)
  12536. (aO/a1 /a2,dO/d1 Id21d31d41d5)
  12537. *** functions in Release 2.0 or higher *'*
  12538. -474 QueryOverscan(displaylD,rect,oScanType)(aO/a1,dO)
  12539. -480 MoveWindowlnFrontOf(window,behindWindow)(aO/a1)
  12540. -486 ChangeWindowBox(window, left,top,width, height)(aO,dO/d 1 /d2/d3)
  12541. -492 SetEditHook(hook)(aO)
  12542. -498 SetMouseQueue(window,queueLength)(aO,dO)
  12543. -504 ZipWindow(window)(aO)
  12544. --- public screens ---
  12545. -510 LockPubScreen(name)(aO)
  12546. -516 UnlockPubScreen(name,screen)(aO/a1)
  12547. -522 LockPubScreenList()()
  12548. -528 UnlockPubScreenList()()
  12549. -534 NextPubScreen(screen,namebuf)(aO/a1)
  12550. -540 SetDefaultPubScreen(name)(aO)
  12551. -546 SetPubScreenModes(modes)(dO)
  12552. -552 PubScreen Status (screen , status Flags) (aO , dO)
  12553. -558 ObtainGIRPort(ginfo)(aO)
  12554. -564 ReleaseGIRPort(rp)(aO)
  12555.  
  12556. Page 235
  12557.  
  12558.  
  12559. -570 GadgetMouse(gadget,ginfo,mousePoint)(aO/a1/a2)
  12560. -576 *intuitionPrivatel ()()
  12561. -582 GetDefaultPubScreen(nameBuffer)(aO)
  12562. -588 EasyRequestArgs(window,easyStruct,idcmpPtr,args)(aOlal/a21a3)
  12563. -594 BuildEasyRequestArgs(window,easyStruct,idcmp args)(aO/al,dO/a3)
  12564. -600 SysReqHandler(window,idcmpPtr,waitinput)(aO/a;,dO)
  12565. -606 OpenWindowTaaList(newWindow,tagList) (aO/al )
  12566. -612 OpenScreenTagtist(newScreen,tagList)(aO/a1)
  12567. ---new Image functions---
  12568. -618 DrawimageState(rplimage,leftOffset,topOffset,state,drawinfo)(aO/a1,dO/d1 Id21a2)
  12569. -624 Pointinimage(point,image)(dO/aO)
  12570. -630 Erasel mage( rp, image, leftOffset,topOffset) (aO/a 1,dO/d 1)
  12571. -636 NewObjectA(classPtr classlD,tagList)(aO/a1/a2)
  12572. -642 DisposeObject(objectj(aO)
  12573. -648 SetAttrsA(object,tagList)(aO/a1)
  12574. -654 GetAttr(attrlD,object,storagePtr)(dO/aO/a1)
  12575. ---special set attribute call for gadgets---
  12576. -660 SetGadgetAttrsA(gadget,window, requester,tagList)(aO/a1 /a2/a3)
  12577. -666 NextObject(objectPtrPtr)(aO)
  12578. -672 *intuitionPrivate2()()
  12579. -678 MakeClass(classlD,superClasslD,superClassPtr,instanceSize,flags)(aO/a1/a2,dO/d1)
  12580. -684 AddClass(classPtr)(aO)
  12581. -690 GetScreenDrawinfo(screen)(aO)
  12582. -696 FreeScreenDrawinfo(screen,drawinfo)(aO/a1)
  12583. -702 ResetMenuStrip(window menu)(aO/a1)
  12584. -708 RemoveClass(classPtr)(aO)
  12585. -714 FreeClass(classPtr)(aO)
  12586. -720 *intuitionPrivate3()()
  12587. -726 *intuitionPrivate4()()
  12588.  
  12589. DISKFONT
  12590.  
  12591. -30 OpenDiskFont(textAttr)(aO)
  12592. -36 AvailFonts(buffer,bufBytes,flags)(aO,dO/d1)
  12593. ***functions in Release 1.2 or higher'''
  12594. -42 NewFontContents(fontsLock,fontName) (aO/a 1)
  12595. -48 DisposeFontContents(fontContentsHeader)(a1)
  12596. *** functions in Release 2.0 or higher'''
  12597. -54 N ewScal ed Di sk Font(sou rce Font, destTe xtAttr) (aO/a 1)
  12598.  
  12599. Page 236
  12600.  
  12601.  
  12602. APPENDIX 3: AMIGA HARDWARE REGISTERS
  12603.  
  12604. The following are a list of memory locations where direct access to the Agnus, Denise
  12605. and Paula chips is possible. It is illegal to access any of these registers if you wish
  12606. your program to behave correctly in the Amiga environment. However in BlitzMode
  12607. most of these registers may be accessed taking into consideration the accompanying
  12608. documentation.
  12609.  
  12610. An * next to any description states that the option is available only with the new ECS
  12611. (Enhanced Chip Set). Also note that any reference to memory pointers MUST point
  12612. to chip rnem as the Amiga Chip Set is NOT capable of accessing FAST mem. This
  12613. includes BitPlane data, copper lists, Sprite Data, Sound DATA etc. etc.
  12614.  
  12615. BitPlane & Display Control
  12616.  
  12617. The Amiga has great flexibility in displaying graphics at different resolutions and
  12618. positions on the monitor. The hardware registers associated with the display are
  12619. nearly always loaded by the copper and not with the 68000 processor.
  12620.  
  12621.     #BPLCONO=$1 oo
  12622.     #BPLCON 1=$1 02
  12623.     #BPLCON2=$1 04
  12624.     #BPLCON3=$106    ;(ECS only)
  12625.     #BPLCON4=$10c    ;(AGA only)
  12626.  
  12627. BIT#    BPLCONO        BPLCON1        BPLCON2        BPLCON3        BPLCON4
  12628. 15    HIRES        PF2H3        COLBANK2    BPLAM7
  12629. 14    BPU2        ZDBPSEL2    COLBANK1    BPLAM6
  12630. 13    BPU1        ZDBPSEL1    COLBANK0    BPLAM5
  12631. 12    BPUO        ZDBPSELO    PF20F2        BPLAM4
  12632. 11    HAM        ZDPEN        PF20F1        BPLAM3
  12633. 10    DBLPF        ZDCTEN        PF20FO        BPLAM2
  12634. 09    COLOR        KILLEHB        LOCT        BPLAM 1
  12635. 08    GAUD        RDRAM=0        BPLAMO
  12636. 07    PF2H3        SOGEN        SPRES1        ESPRM7
  12637. 06    *SHRES        PF2H2        PF2PRI        SPRESO        ESPRM6
  12638. 05    *BPLHWRM    PF2H1        PF2P2        BRDRBLNK    ESPRM5
  12639. 04    *SPRHWRM    PF2H0        PF2P1        BRDRTRAN    ESPRM4
  12640. 03    LPEN        PF1H3        PF2PO        OSPRM7
  12641. 02    LACE        PF1H2        PF1 P2        ZDCLCKEN    OSPRM6
  12642. 01    ERSY        PF1H1        PF1 P1        BRDSPRT        OSPRM5
  12643. 00    PF1H0        PF1 PO        EXTBLKEN    OSPRM4
  12644.  
  12645. BPUn = number of bitplanes
  12646. PFnHn = playfield horizontal positioning
  12647. ZD... = genlock enable bits
  12648. PFnPn = Playfield priorities
  12649. COLBANKn = active color bank in AGA
  12650. PF20Fn = color offset for playfield 2 in dpf mode
  12651. LOCT = hi/lo nibble select for 24 bit color access
  12652. SPRESn = Sprite resolution
  12653. BRD... = Border settings
  12654. BPLAMx = xor mask for bitplane fetch
  12655. ESPRMn = color offset for even sprites
  12656.  
  12657.  
  12658. Page 237
  12659.  
  12660.  
  12661. #BPLOPTH= $E0    ;BitPlane Pointer 0 High Word
  12662. #BPLOPTL= $E2    ;BitPlane Pointer 0 Low Word
  12663. #BPL1PTH= $E4
  12664. #BPL1 PTL= $E6
  12665. #BPL2PTH= $E8
  12666. #BPL2PTL= $EA
  12667. #BPL3PTH= $EC
  12668. #BPL3PTL= $EE
  12669. #BPL4PTH= $F0
  12670. #BPL4PTL= $F2
  12671. #BPL5PTH= $F4
  12672. #BPL5PTL= $F6
  12673.  
  12674. Each  pair  of  registers  contain an 18  bit  pointer  to  the  address  of
  12675. BitPlanex  data in chip memory.  They MUST be reset every frame  usually  by
  12676. the copper.
  12677.  
  12678. #BPL1MOD=$108  ;BitplaneModulo  for  Odd  Planes  #BPL2MOD=$1  OA  ;Bitplane
  12679. Modulo for EvenPlanes
  12680.  
  12681. At the end of each display line,  the BPLxMODs are added to the the BitPLane
  12682. Pointers so they point to the address of the next line.
  12683.  
  12684. #DIWSTOP=$090 ; display window stop
  12685. #DIWSTRT=$08E ; display window start
  12686.  
  12687. These two registers control the display window size and position. The
  12688. following bits are assigned
  12689.  
  12690. BIT# 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  12691.      V7 V6 V5 V4 V3 V2 V1 V0 H7 H6 H5 H4 H3 H2 H1 H0
  12692.  
  12693. For DIWSTRT V8=0 & H8=0 restricting it to the upper lett of the screen.  For
  12694. DIWSTOP V8=1 & H8=1 restricting it to the lower right of the screen.
  12695.  
  12696. #DDFSTOP=$094 ; data fetch stop
  12697. #DDFSTRT= $092 ; data fetch stant
  12698.  
  12699. The  two  display data fetch registers control when and how many  words  are
  12700. fetched from the bitplane for each line of display.
  12701.  
  12702. Typical values are as follows:
  12703.  
  12704. lores 320 pixels, DDFSTRT & DDFSTOP = $38 & $D0
  12705. hires 640 pixels, DDFSTRT & DDFSTOP = $3C & $d4
  12706.  
  12707. If smooth scrolling is enabled DDFSTRT should be 2 less than above.
  12708.  
  12709. #BPL1 DAT $110 ; BitPlane Data parallel to serial converters
  12710. #BPL2DAT $112
  12711. #BPL3DAT $114
  12712. #BPL4DAT $116
  12713. #BPL5DAT $118
  12714. #BPL6DAT $11A
  12715. These 6 registers receive the DMA data fetched by the BitPlane engine,   and
  12716. output it serially to the Amiga DACS,  triggered by writing to BPLIDAT.  Not
  12717. intended for programmer access.
  12718.  
  12719. Page 238
  12720.  
  12721. The Copper
  12722.  
  12723. The  Copper  is found on the Agnus chip,  it's main job is to 'poke'  values
  12724. into the hardware registers in sync with the video beam.  The main registers
  12725. it updates are BitPlane ptrs,  Sprites and other control words that HAVE  to
  12726. be  reset every frame.  It's also used to split the screen vertically as  it
  12727. is  capable of waiting for certain video beam positions before writing data.
  12728. Its  also  capable of waiting for the blister to finish as well as  skipping
  12729. instructions if beam position is equal to certain values.
  12730.  
  12731. #COP1 LCH=$080
  12732. #COP1 LCL=$082
  12733.  
  12734. #COP2LCH=$084
  12735. #COP2LCL=$086
  12736.  
  12737. Each  pair of registers contain an 18 bit pointer to the address of a Copper
  12738. List in chip mem.  The Copper will automatically jump to the address in COPI
  12739. at  the  beginning of the frame and is able to jump to COP2 if the following
  12740. strobe is written to.
  12741.  
  12742. #COPJMP1 =$88
  12743. #COPJMP2=$8A
  12744.  
  12745. When  written  to these addresses cause the copper to jump to the  locations
  12746. held  in COP I LC & COP2LC.  The Copper can write to these registers  itself
  12747. causing its own indirect jump.
  12748.  
  12749. #COPCON=$2E
  12750.  
  12751. By  setting  bit  I  of this register the copper is allowed  to  access  the
  12752. blister hardware.
  12753.  
  12754. The  copper  fetches two words for each instruction from its current  copper
  12755. list.  The three instructions it can perform and their relevant bits are  as
  12756. follows:
  12757.  
  12758.     Bit#    MOVE    WAIT     UNTIL        SKIP         IF
  12759.  
  12760.     15    x    RD15    VP7        BFD        VP7        BFD
  12761.     14    x    RD14    VP6        VE6        VP6        VE6
  12762.     13    x    RD13    VP5        VE5        VP5        VE5
  12763.     12    x    RD12    VP4        VE4        VP4        VE4
  12764.     11    x    RD11    VP3        VE3        VP3        VE3
  12765.     10    x    RD10    VP2        VE2        VP2        VE2
  12766.     09    x    RD09    VP1        VE1        VP1        VE1
  12767.     08    DAB    RD08    VP0        VE0        VP0        VE0
  12768.     07    DA7    RD07    HP8        HE8        HP8        HE8
  12769.     06    DA6    RD06    HP7        HE7        HP7        HE7
  12770.     05    DA5    RD05    HP6        HE6        HP6        HE6
  12771.     04    DA4    RD04    HP5        HE5        HP5        HE5
  12772.     03    DA3    RD03    HP4        HE4        HP4        HE4
  12773.     02    DA2    R D02    HP3        HE3        HP3        HE3
  12774.     01    DA1    RD01    HP2        HE2        HP2        HE2
  12775.     00    0    RD00    1        0        1        1
  12776.  
  12777. The  MOVE  instruction shifts the value held in RD15-0  to  the  destination
  12778. address calculated by $DFF000 +DA8- 1.
  12779.  
  12780. The  WAIT  UNTIL  instruction places the copper in a wait  state  until  the
  12781. video  beam  position  is  past HP,VP (xy coordinates).   The  Copper  first
  12782. logical AIDS (masks) the
  12783.  
  12784. Page 239
  12785.  
  12786. video  beam with HE,VE before doing the comparison.  If BFD is set then  the
  12787. blister must also be finished before the copper will exit its wait state.
  12788.  
  12789. The  SKIP  IF  instruction  is  similar to the WAIT  UNTIL  instruction  but
  12790. instead  of  placing the copper in a wait state if the video  beam  position
  12791. fails the comparison test it skips the next MOVE instruction.
  12792.  
  12793. Colour Registers
  12794.  
  12795. The following 32 color registers can each represent one of 4096 colors.
  12796.  
  12797. #COLO R00=$ 180    #COLO R08=$ 190        #CO LOR 16=$ 1 A0    #COLO R24=$ 1 B0
  12798. #COLOR01=$182    #COLOR09=$192        #COLOR17=$1A2        #COLOR25=$1B2
  12799. #COLO R02=$184    #COLOR 10=$ 194        #COLOR 18=$1 A4        #COLOR26=$ 1 B4
  12800. #COLOR03=$186    #COLOR11=$196        #COLOR19=$1A6        #COLOR27=$1B6
  12801. #COLOR04=$ 188    #COLO R 12=$ 198    #COLOR20=$1 A8        #COLOR28=$ 1 B8
  12802. #COLO R05=$ 18A    #COLOR 13=$ 19A        #COLOR21 =$1 AA        #COLO R29=$ 1 BA
  12803. #COLOR06=$18C    #COLOR14=$19C        #COLOR22=$1AC        # COLOR30=$1BC
  12804. #COLOR07=$18E    #COLO R 15=$ 19E    #COLOR23=$1 AE        #COLO R31 =$ 1 BE
  12805.  
  12806. The bit usage for each of the 32 colors is:
  12807.  
  12808. BIT#  15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  12809.        x x x x R3 R2 R1 R0 G3 G2 G1 G0 B3 B2 B1 B0
  12810.  
  12811. This represents a combination of 16 shades of red, green and blue.
  12812.  
  12813. glitter Control
  12814.  
  12815. The  glitter is located on the Agnus,  it's main function is to move  blocks
  12816. of  data  around chip mem.  It has 3 input channels A,B &  C  and  I  output
  12817. channel D.  A simple block move would use I input channel and the  I  output
  12818. channel,  taking 4 clock ticks per cycle.  A complex move such as a moving a
  12819. shape to a destination with a cookie cut would use all 3 input channels  and
  12820. the output channel taking 8 clock ticks per cycle.
  12821.  
  12822. The  main  parameters of the blister include the width  and  height  of  the
  12823. block  to  be  moved (width is in multiples of words),  a start address  for
  12824. each  channel,  a modulo for each channel that is added to their address  at
  12825. the  end of each line so they point to the next line,  a logic function that
  12826. specifies which input channels data will be sent to the destination channel.
  12827. The  following  is  a  table to work out the logic tunction  (known  as  the
  12828. minterm) for a blister operation.
  12829.  
  12830.     A    B    C    D
  12831.  
  12832.     O    O    0    LF0
  12833.     O    O    1    LF1
  12834.     0    1    0    LF2
  12835.     O    1    1    LF3
  12836.     1    0    0    LF4
  12837.     1    0    1    LF5
  12838.     1    1    0    LF6
  12839.     1    1    1    LF7
  12840.  
  12841. Page 240
  12842.  
  12843.  
  12844.  
  12845. If  the  glitter is set up so that channel A points to the cookie,  B points
  12846. to  the  shape to be copied and C&D point to the destination bitplane  (such
  12847. as how Blitz 2 uses the blister) we would specify the following conditions:
  12848.  
  12849. When A is I then make D=B When A is O then make D=C
  12850.  
  12851. Using  the  above table we calculate the values of LFO-LF7  when  these  two
  12852. conditions are met.  The top line has A=0 so LFO becomes the value in the  C
  12853. column which is a 0.  A is O in the first 4 rows so LFO-LF3 all reflect  the
  12854. bits in the C column (0l0l)  and A= l in the lower 4 rows so LF4-LF7 reflect
  12855. the bits in the B column (001 I ).
  12856.  
  12857. This generates a minterm LFO-LF7 of % l O I O I l 00 or in hex $AC.
  12858.  
  12859. Note:   read  the values of LF7 to LFO from bottom to top to  calculate  the
  12860. correct hexadecimal minterm.
  12861.  
  12862. #BLTAPTH= $50
  12863. #BLTAPTL= $52
  12864.  
  12865. #BLTBPTH= $4C
  12866. #BLTBPTL= $4E
  12867.  
  12868. #BLTCPTH= $48
  12869. #BLTCPTL= $4A
  12870.  
  12871. #BLTDPTH= $54
  12872. #BLTDPTL= $56
  12873.  
  12874. Each  pair  of registers contain an 18 bit pointer to the start  address  of
  12875. the 4 blister channels in chip mem.
  12876.  
  12877. #BLTAMOD=$64
  12878. #BLTBMOD=$62
  12879. #BLTCMOD=$60
  12880. #BLTDMOD=$66
  12881.  
  12882. The  4  modulo values are added to the blister pointers at the end  of  each
  12883. line.
  12884.  
  12885. #BLTADAT=$74
  12886. #BLTBDAT=$72
  12887. #BLTCDAT= $70
  12888.  
  12889. If  a blister channel is disabled the BLTxDAT register can be loaded with  a
  12890. constant value which will remain unchanged during the blit operation.
  12891.  
  12892. #BLTAFWM=$44 ; glitter first word mask for source A
  12893. #BLTALWM=$46 ; glitter last word mask for source A
  12894.  
  12895. During  a  glitter  operation  these two registers  are  used  to  mask  the
  12896. contents of BLTADAT for the first and last word of every line.
  12897.  
  12898. Page 241
  12899.  
  12900.  
  12901. #BLTCONO=$40
  12902. #BLTCON1=$42
  12903.  
  12904. The following bits in BLTCONO & BLTCON I are as follows.
  12905.  
  12906.  
  12907.     BIT#    BLTCONO    BLTCON1
  12908.  
  12909.     15    ASH3    BSH3
  12910.     14    ASH2    BSH2
  12911.     13    ASH1    BSH1
  12912.     12    ASHO    BSHO
  12913.     11    USEA    x
  12914.     10    USEB    x
  12915.     09    USEC    x
  12916.     08    USED    x
  12917.     07    LF7    x
  12918.     06    LF6    x
  12919.     05    LF5    x
  12920.     04    LF4    EFE
  12921.     03    LF3    IFE
  12922.     02    LF2    FCI
  12923.     01    LF1    DESC
  12924.     00    LFO    0 (1=line mode)
  12925.  
  12926.  
  12927. ASH  is  the  amount that source A is shifted (barrel rolled)  USEX  enables
  12928. each  of  the  4  blitter channels LF holds the logic function as  discussed
  12929. previously  in  this  section BSH is the amount that  source  B  is  shifted
  12930. (barrel  rolled)  EFE is the Exclusive Fill Enable flag IFE is the Inclusive
  12931. Fill  Enable  flag FCI is the Fill Carry Input DESC is the  descending  flag
  12932. (blitter uses decreasing addressing)  #BLTSIZE=$58 By writing the height and
  12933. width  of  the  blit  operation  to  BLTSIZE  the  blitter  will  start  the
  12934. operation.  Maxiiiiutii size is 1024 hi-h and 64 words (1024 bits) wide. The
  12935. followingdefines bits in BLTZSIZE
  12936.  
  12937. BIT#15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  12938.      h9 h8 h7 h6 h5 h4 h3 h2 hl hO w5 w4 w3 w2 wl wO
  12939. #BLTSIZV=$5C ;(ECS ONLY)
  12940. #BLTSIZH=$5E ;(ECSONLY)
  12941.  
  12942. With  the  new ECS writing to BLTSIZV first and then BLTSZH the blitter  can
  12943. operate on blocks as large as 32K x 32K pixels in size.
  12944.  
  12945. The  Blitter  is  also  able  to  perform  linedrawing  and  filled  polygon
  12946. functions.  Details about using the blitter for these functions can be found
  12947. on the exai-nples disk included with Blitz 2.
  12948.  
  12949. Page 242
  12950.  
  12951. Audio Control
  12952.  
  12953. The Amiga has 4 channels of 8 bit audio,  each with their own memory access,
  12954. period  and  volume  control.  The following are a list  of  the  applicable
  12955. hardware registers.
  12956.  
  12957. #AUDOLCH=$AO
  12958. #AUDOLCL=$A2
  12959. #AUD1LCH=$BO
  12960. #AUD1LCL=$B2
  12961. #AUD2LCH=$CO
  12962. #AUD2LCL=$C2
  12963. #AUD3LCH=$DO
  12964. #AUD3LCL=$D2
  12965.  
  12966. #AUDOLEN=$A4
  12967. #AUD1LEN=$B4
  12968. #AUD2LEN=$C4
  12969. #AUD3LEN=$D4
  12970.  
  12971. #AUDOPER=$A6 ;period
  12972. #AUD1PER=$B6
  12973. #AUD2PER=$C6
  12974. #AUD3PER=$D6
  12975.  
  12976. #AUDOVOL=$A8
  12977. #AUD1VOL=$B8
  12978. #AUD2VOL=$C8
  12979. #AUD3VOL=$D8
  12980.  
  12981. #AUDODAT=$AA
  12982. #AUD1DAT=$BA
  12983. #AUD2DAT=$CA
  12984. #AUD3DAT=$DA
  12985.  
  12986. Sprite Control
  12987.  
  12988. ; pairs of 24 bit memory pointers to audio data in chip mem
  12989.  
  12990. ;volume registers (0-63)
  12991.  
  12992. The  Amiga hardware is capable of displaying eight 4 colour sprites or  four
  12993. 16  colour sprites.  Standard control of sprites is done by using the copper
  12994. to setup the 8 sprite pointers at the beginning of each frame.
  12995.  
  12996. #SPROPTH=$120
  12997. #SPROPTL=$122
  12998. #SPR1PTH=$124
  12999. #SPR1PTL=$126
  13000. #SPR2PTH=$128
  13001. #SPR2PTL=$12A
  13002. #SPR3PTH=$12C
  13003. #SPR3PTL=$12E
  13004. #SPR4PTH=$130
  13005. #SPR4PTL=$132
  13006. #SPR5PTH=$134
  13007. #SPR5PTL=$136
  13008. #SPR6PTH=$138
  13009. #SPR6PTL=$13A
  13010. #SPR7PTH=$13C
  13011. #SPR7PTL=$13E
  13012.  
  13013. ;pairs of 24 bit memory pointers to sprite data in chip mem
  13014.  
  13015. The pointers should point to data that begins with two words containing  the
  13016. SPRPOS & SPRCTL values tor that sprite,  followed by its image data and with
  13017. two null words that terminate the data.
  13018.  
  13019. Page 243
  13020.  
  13021.  
  13022.     #SPROPOS=$140    #SPROCTL=$142    #SPRODATA=$144 #SPRODATB=$146
  13023.     #SPRlPOS=$148    #SPR1CTL=$14A    #SPR1DATA=$14C #SPR1DATB=$14E
  13024.     #SPR2POS=$150    #SPR2CTL=$152    #SPR2DATA=$154 #SPR2DATB=$156
  13025.     #SPR3POS=$158    #SPR3CTL=$15A    #SPR3DATA=$15C #SPR3DATB=$15E
  13026.     #SPR4POS=$160    #SPR4CTL=$162    #SPR4DATA=$164 #SPR4DATB=$166
  13027.     #SPR5POS=$168    #SPR5CTL=$16A    #SPR5DATA=$16C #SPR5DATB=$16E
  13028.     #SPR6POS=$170    #SPR6CTL=$172    #SPR6DATA=$174 #SPR6DATB=$176
  13029.     #SPR7POS=$178    #SPR7CTL=$17A    #SPR7DATA=$17C #SPR7DATB=$17E
  13030.  
  13031. Using  standard  sprite DMA the above registers  are  all  loaded  from  the
  13032. sprite  data pointed to in chip mem by the sprite pointers.  These registers
  13033. are  only of interest to people wanting to 'multiplex' sprites by using  the
  13034. copper to load these registers rather than sprite DMA,
  13035.  
  13036. The t'ollowing is bit definitions of both SPRPOS and SPRCTL.
  13037.  
  13038.     BiT# 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  13039.  
  13040. POS SV7 SV6 SV5 SV4 SV3 SV2 SV1SV0 SH8 SH7 SH6 SH5 SH4 SH3SH2SH1
  13041.  
  13042.     CTL EV7 EV6 EV5 EV4 EV3 EV2 EV1EV0 ATT X X X    X SV8 EV8 SH0
  13043.  
  13044. SV  is  the  vertical  start position of the sprite  SH  is  the  horizontal
  13045. position  of  the  sprite (calulated in lores pixels  only)   EVis  the  end
  13046. vertical  position ATTis the sprite attached bit (connects  odd  sprites  to
  13047. their predecessors)
  13048.  
  13049. Interupt Control
  13050.  
  13051. #INTENA=$9A ;interupt enable write address
  13052. #INTENAR=$1C ;interupt enable read address
  13053.  
  13054. #INTREQ=$9C ;interupt request write address
  13055. #INTREQR=$1E ;interupt request read address
  13056.  
  13057. INTENA  is  used  to enable or disable interupts.  If the value  written  to
  13058. INTENA  has  bit  15  set  any other of the bits enable their  corresponding
  13059. interupts.  If bit 15 is clear any of the other bits set will disable  their
  13060. corresponding interupts.
  13061.  
  13062. INTENAR will return which interupts are currently enabled.
  13063.  
  13064. INTREQ is used to initiate or clear an interupt.  It is mostly used to clear
  13065. the  interupt  by  the interupt handler.  Again Bit# 15 states  whether  the
  13066. corrsponding interupts will be requested or cleared.
  13067.  
  13068. INTREQR returns which interupts are currently requested.
  13069.  
  13070. Page 244
  13071.  
  13072.  
  13073. The following bit definitions relate to the 4 interupt control registers.
  13074.  
  13075. BIT#    NAME        LEVEL    DESCRIPTION
  13076.  
  13077. 15    SET/CLR            determines if bits written with 1 are set or cleared
  13078. 14    INTEN            master interupt enable
  13079. 13    EXTER        6    external interupt
  13080. 12    DSKSYN        5    disk sync register (same as DSKSYNC)
  13081. 11    RBF        5    serial port Receive Buffer Full
  13082. 10    AUD3        4    audio channel 3 finished
  13083. 09    AUD2        4    audio channel 2 finished
  13084. 08    AUDI        4    audio channel 1 finished
  13085. 07    AUD0        4    audio channel 0 finished
  13086. 06    BLIT        3    blister finished
  13087. 05    VERTB        3    start of vertical blank interupt
  13088. 04    COPER        3    copper
  13089. 03    PORTS        2    I/O ports and timers
  13090. 02    SOFT        1    reserved for software initiated interupts
  13091. 01    DSKBLK        1    disk block finished
  13092. 00    TBE        1    serial port Transmit Buffer Empty
  13093.  
  13094.  
  13095. The  following locations hold the address of the 68000 interupt handler code
  13096. in memory for each level of interupt.
  13097.  
  13098. LEVEL    68000 Address
  13099.  
  13100. 6        $78
  13101. 5        $74
  13102. 4        $70
  13103. 3        $6c
  13104. 2        $68
  13105. 1        $64
  13106.  
  13107. DMA Control
  13108.  
  13109. DMA  stands  for  direct memory access.  Chip mem can  be  accessed  by  the
  13110. display,  blister,  copper,  audio,  sprites and diskdrive without using the
  13111. 68000  processor.  DMACON enables the user to lock out  any  of  these  from
  13112. havidg direct memory access (DMA) to chipmem.
  13113.  
  13114. As  with INTENA bit l S of DMACON signals whether the write opertaion should
  13115. clear or set the relevant bits of the DMA control.
  13116.  
  13117. DMACONR  will not only return which channels have DMA access but  has  flags
  13118. BBUSY  which  return  true if the blister is in operation  and  BZERO  which
  13119. return  if the glitter has generated any l's from it logic function  (useful
  13120. for collision detection etc.)
  13121.  
  13122. #DMACON=$96 ;DMA control write (dear or set)  #DMACONR=$02 ;DMA control read
  13123. (and blister status) read
  13124.  
  13125. Page 245
  13126.  
  13127.  
  13128. The following are the bits assigned to the two DMACON registers:
  13129.  
  13130. BIT#    NAME        DESCRIPTION
  13131.  
  13132. 15    SET/CLR        determines if bits written with 1 are set or cleared
  13133. 14    BBUSY        blister busy flag
  13134. 13    BZERO        blister logic zero
  13135. 12    X            
  13136. 11    X            
  13137. 10    BLTPRI        "blister nasty" signals blister has DMA priority over CPU
  13138. 09    DMAEN        enable all DMA below
  13139. 08    BPLEN        BitPlane DMA enable
  13140. 07    COPEN        Copper DMA enable
  13141. 06    BLTEN        glitter DMA enable
  13142. 05    SPREN        Sprite DMA enable
  13143. 04    DSKEN        Disk DMA enable
  13144. 03    AUD3EN        Audio channel 3 DMA enable
  13145. 02    AUD2EN        Audio channel 2 DMA enable
  13146. 01    AUDI EN        Audio channel 1 DMA enable
  13147. 00    AUDOEN        Audio channel 0 DMA enable
  13148.  
  13149. Amiga ClAs
  13150.  
  13151. The Amiga has two 8520 Complex Interface Adapter (CIA)  which handle most of
  13152. the Amiga I/O activities.  Note that each register should be accessed  as  a
  13153. byte and NOT a word. The following is an address map of both Amiga CIAs.
  13154.  
  13155.     CIA-A    Address    Register    b7 b6 b5 b4 b3 b2 b1 bO
  13156.  
  13157.     $BFE001    pra FIR1 FIR0 RDY TK0 WPR0 CHNG    LED OVL
  13158.     $BFE101    prb Parallel Port
  13159.     $BFE201    ddra Direction for Port A (1=output)
  13160.     $BFE301    ddrb Direction for Port B (1=output)
  13161.     $BFE401    talo Timer A High Byte
  13162.     $BFE501    tahi Timer A High Byte
  13163.     $BFE601    thlo Timer B Low Byte
  13164.     $BFE701    tbhi Timer B High Byte
  13165.     $BFE801    todlo 50/60 Hz Event Counter bits 7-0
  13166.     $BFE901    todmid 50/60 Hz Event Counter bits 15-8
  13167.     $BFEA01    todhi 50/60 Hz Event Counter bits 23-16
  13168.     $BFEB01    not used
  13169.  
  13170.     $BFEC01    sdr    Serial Data Register (connected to keyboard)
  13171.     $BFED01    icr    Interrupt Control Register
  13172.     $BFEE01    cra    Control Register A
  13173.     $BFEF01    crb    Control Register B
  13174.  
  13175.     CIA-B    Address    Register    b7 b6 b5 b4 b3 b2 b1 bO
  13176.         $BFD000    pra    DTR RTS CD CTS DSR SEL POUT BUSY
  13177.  
  13178.         $BFD100    prb MTR SEL3 SEL2 SEL1 SEL0 SIDE DIR    STEP
  13179.         $BFD200    ddra Direction for Port A (1=output)
  13180.         $BFD300    ddrb Direction for Port B (1=output)
  13181.         $BFD400    talo Timer A High Byte
  13182.         $BFD500    tahi Timer A High Byte
  13183.         $BFD600    tblo Timer B Low Byte
  13184.         $BFD700    tbhi Timer B High Byte
  13185.         $BFD800    todlo Horizontal Sync Event Counter bits 7-0
  13186.         $BFD900    todmid Horizontal Sync Event Counter bits 15-8
  13187.         $BFDA00    todhi Horizontal Sync Event Counter bits 23-16
  13188.         $BFDB00    not used
  13189.  
  13190.         $BFDC00    sdr    Serial Data Register (connected to keyboard)
  13191.         $BFDD00    icr    Interrupt Control Register
  13192.         $BFDE00    cra    Control Register P
  13193.         $BFDF00    crb    Control Register E
  13194.  
  13195. Page 246
  13196.  
  13197.  
  13198.  
  13199. APPENDIX 4: 68000 ASSEMBLY LANGUAGE
  13200. Although Blitz 2 is a BASIC compiler,  it also has an 'inline assembler' and
  13201. can be used as a fully fledged assembler.  Assembly language is the language
  13202. of the microprocessor, in the case of the Amiga, the 68000 microprocessor.
  13203.  
  13204. The  following  is a brief description of the Motorola 68000  microprocessor
  13205. and  its instruction set,  for more information we recommend the data  books
  13206. published by Motorola themselves as the best source of reference material.
  13207.  
  13208. Registers
  13209.  
  13210. The 68000 has 1 6 internal registers,  these may be thought of as high speed
  13211. variables  each  capable  of storing a long word  (32  bits).   The  8  data
  13212. registers  are  used mainly for calculations while the 8  address  registers
  13213. are mostly used for pointing to locations in memory.
  13214.  
  13215. The  registers  are  named  DO-D7 and AO-A7.  The  68000  also  has  several
  13216. speciaiised  registers,  the program counter (PC)  and the  status  register
  13217. (SR)   The  program  counter  points to the  current  instruction  that  the
  13218. microprocessor is executing,  while the status register is a bunch of  flags
  13219. with various meanings.
  13220.  
  13221. Addressing
  13222.  
  13223. The  main  job  of  the microprocessor is to read information  from  memory,
  13224. perform a calculation and then write the result back to memory.
  13225.  
  13226. For  the processor to access memory it has to generate a memory address  for
  13227. the  location it wishes to access (read or write to)  The foiiowing are  the
  13228. different ways the 68000 can generate addresses.
  13229.  
  13230. Register Direct:  MOVE d 1,dO The actual value in the register d I is copied
  13231. into dO
  13232.  
  13233. Address  Register Indirect:  MOVE (aO),dO aO is a pointer  to  somewhere  in
  13234. memory. The value at this location is copied into the register dO.
  13235.  
  13236. Address  Register Indirect with Postincrement:  MOVE (aO)+,dO The  value  at
  13237. the  location pointed to by aO is copied into the register dO,  then  aO  is
  13238. incremented so it points to the next memory location.
  13239.  
  13240. Address  Register  Indirect with Predecrement:  MOVE -(aO),dO  aO  is  first
  13241. decremented  to  point to the memory location before the  one  it  currently
  13242. points to then the value at the new memory location is copied into dO.
  13243.  
  13244. Address  Register  Indirect with Displacement:  MOVE I 6(aO),dO  The  memory
  13245. location  located  16  bytes  after that which  is  pointed  to  by  address
  13246. register aO is copied to dO.
  13247.  
  13248. Page 247
  13249.  
  13250. Address  Register  Indirect with Index:  MOVE I 6(aO,d  1  ),dO  The  memory
  13251. location is calculated by adding the contents of aO with d I plus 16.
  13252.  
  13253. Absolute Address: MOVE $dff'096,dO The memory location $dff'096 is used.
  13254.  
  13255. Program  Counter with Displacement:  MOVE label(pc),dO This is the  same  as
  13256. absolute  addressing but because the memory address is an  offset  from  the
  13257. program counter (no bigger than 32000 bytes) it is MUCH quicker.
  13258.  
  13259. Program Counter with Index:  MOVE label(pc,d I ),dO The address is calulated
  13260. as the location of label plus the contents of data register d 1.
  13261.  
  13262. Immediate Data: MOVE #20,dO The value 20 is moved to the data register.
  13263.  
  13264. Program Flow
  13265.  
  13266. As  mentioned previously the microprocessor has a special register known  as
  13267. the program counter that points to the next instruction to be executed.   By
  13268. changing  the  value in the program counter a 'goto' can be performed.   The
  13269. JMP instruction load the program counter with a new value,  it supports most
  13270. of the addressing modes.
  13271.  
  13272. A  branch  is  a  program  counter relative form  of  the  JMP  instruction.
  13273. Branches can also be performed on certain conditions such as BCC which  will
  13274. only  cause  the  program flow to change if the Carry  flag  in  the  status
  13275. register is currently set.
  13276.  
  13277. A  'Gosub''  can be performed using the JSR and BSR commands.   The  current
  13278. value  of the program counter is remembered on the stack before the jump  or
  13279. branch  is  performed.  The RTS command is used to return  to  the  original
  13280. program location.
  13281.  
  13282. The Stack
  13283.  
  13284. The  Amiga sets aside a certain amount of memory for each task  known  as  a
  13285. stack.   The  address register A7 is used to point to the stack  and  should
  13286. never be used as a general purpose address register.
  13287.  
  13288. The  68000  uses  predicament addressing to push data  onto  the  stack  and
  13289. postincrement addressing to pull information off the stack.
  13290.  
  13291. JSR is the same as MOVE.I pc,-(a7) and then JMP
  13292.  
  13293. RTS is the same as MOVE.I (a7)+,pc
  13294.  
  13295. The stack can be used to temporarily store internal registers.  To save  and
  13296. restore all the 68000 registers the following code is often used
  13297.  
  13298. ASubroutine:  MOVEM.I dO-d7/aO-a6,-(a7)  ,push all register on  stack  ;main
  13299. subroutine  code here which can stuff up registers without worrying  MOVEM.I
  13300. (a7)+,dO-d7/aO-a6 ;pull registers off stack
  13301.  
  13302. RTS ;returnfrom subroutine
  13303.  
  13304. Page 248
  13305.  
  13306. Condition Flags
  13307.  
  13308. The  status register is a special 68000 register that holds,  besides  other
  13309. things  all the condition codes.  The following are a list of the  condition
  13310. flags:
  13311.  
  13312. Code      Name        Meaning
  13313.  
  13314. N    negative    reflects the most significant bit of the result of the last operation.
  13315. Z    zero        is set if the result is zero, cleared otherwise.
  13316. C    carry        is set when an add, subtract or compare operation generate a carry
  13317. X    extend        is a mirror of the carry flag, however its not affected by data movement.
  13318. V    overf ow    is set when an arithmetic operation causes an overflow, a situation where
  13319.                     the operand is not large enough to represent the result.
  13320.  
  13321. Conditional Tests
  13322.  
  13323. Branches and Sets can be performed conditionally.  The following is  a  list
  13324. of  the  possible conditions that can be tested before a branch  or  set  is
  13325. performed.
  13326.  
  13327. cc    condition        coding        test
  13328.  
  13329. T    true            0000        0
  13330. F    false            0001        1
  13331. HI    high            0010        not C & not Z
  13332. LS    lowsam            0011        C | Z
  13333. CC    carry clr        0100        not C
  13334. CS    carry set        0101        C
  13335. NE    not equal        0110        not Z
  13336. EQ    equal            0111        Z
  13337. VC    overflow clr    1000        not V
  13338. VS    overflow set    1001        V
  13339. PL    plus            1010        not N
  13340. MI    minus            1011        N
  13341. GE    greater equal    1100        N&V | notN¬V
  13342. LT    less than        1101        N¬V I notN&V
  13343. GT    greater than    1110        N&V¬Z I notN¬V¬C
  13344. LE    less or equal    1111        Z I N¬V I notN&V
  13345.  
  13346. Operand Sizes
  13347.  
  13348. The 68000 can perform operations on bytes,  words and long words.  By adding
  13349. a suffix .b .w or .l to the opcode,  the assembler knows which data size you
  13350. wish to use,  if no suffix is present the word size is default.  There is no
  13351. speed  increase  using bytes instead of words as  the  68000  is  a  16  bit
  13352. microprocessor and so no overhead is needed for 16 bit operations.   However
  13353. 32  bit long words do cause overhead with extra read and write cycles needed
  13354. to perform operations on a bus that can only handle 16 bits at a time.
  13355.  
  13356. Page 249
  13357.  
  13358.  
  13359.  
  13360. The 68000 Instruction Set
  13361.  
  13362. The following is a brief description of the 68000 instruction set.
  13363.  
  13364. Included with each are the addressing mode combinations available with  each
  13365. opcode. Their syntax are as follows:
  13366.  
  13367.      Dndata register
  13368.      Anaddress register
  13369.      Dy, Dxdata registers source & destination
  13370.      Rx,Ryregister source & destination (data & address registers)
  13371.      <ea>effective address - a subset of addressing modes
  13372.      #<data>numeric constant
  13373.  
  13374. Special notes:
  13375.  
  13376. The address register operands ADDA,  CMPA,  MOVEA and SUBA are only word and
  13377. long word data sizes.  The last'A'of the operand name is optional as  it  is
  13378. with the immediate operands ADDI, CMPI, MOVE], SUBI, ORI, EORI and ANDI.
  13379.  
  13380. The ADDQ and SUBQ are quick forms of their immediate cousins.  The immediate
  13381. data  range is 1 to 8.  The MOVEQ instruction has a data range  of  -128  to
  13382. 127,  the data is sign extended to 32 bits,  and long is the only data  size
  13383. available.
  13384.  
  13385. The  <ea>  denotes  an  effective address,  not  all  addressing  modes  are
  13386. available with each effective address form of the instruction,   as  a  rule
  13387. program  counter  relative  addressing is  only  available  for  the  source
  13388. operand and not the destination.
  13389.  
  13390. The  Blitz2 compiler will signal any illegal forms of the instruction during
  13391. the compile stage.
  13392.  
  13393.  
  13394.     ABCD    Add with extend using BCD
  13395.         ABCD Dy,Dx
  13396.         ABCD -(Ay),-(Ax)
  13397.     ADD    Add binary
  13398.         ADD <ea>,Dn
  13399.         ADD Dn,<ea>
  13400.         ADDA <ea>,An
  13401.         ADDI #<data>,<ea>
  13402.         ADDO #<data>,<ea>
  13403.     ADDX    Add with Extend
  13404.         ADDX Dy,Dx
  13405.         ADDX -(Ay),-(Ax)
  13406.     AND    AND logical
  13407.         AND <ea>,Dn
  13408.         AND Dn,<ea>
  13409.         ANDI #<data>,<ea>
  13410.     ASL    Arithmetic Shift Left
  13411.         ASL Dx,Dy
  13412.         ASL #<data>,Dy
  13413.         ASL <ea>
  13414.     ASR    Arithmetic Shift Pight
  13415.         ASR Dx,Dy
  13416.         ASR #<data>,Dy
  13417.         ASR <ea>
  13418.     Bcc    Branch Conditionally
  13419.         Bcd <label>
  13420.     BCHG    Test a Bit & Change
  13421.         BCHG Dn,<ea>
  13422.         BCHG #<data>,<ea>
  13423.     BCLR    Test a Bit & Clear
  13424.         BCLR Dn,<ea>
  13425.         BCLR #<data>,<ea>
  13426.     BRA    Branch Always
  13427.         BRA <label>
  13428.     BSET    Test a Bit & Set
  13429.  
  13430. Page 250
  13431.  
  13432.  
  13433.      BSET Dn,<ea>
  13434.      BSET #<data>,<ea>
  13435. BTSTTest a Bit
  13436.      BTST Dn,<ea>
  13437.      BTST #<data>,<ea>
  13438. CHKCheck Register Against Bounds
  13439.      CHK <ea>,Dn
  13440. CLRClear an Operand
  13441.      CLR <ea>
  13442. CMPCompare
  13443.      CMP <ea>,Dn
  13444.      CMPA <ea>,An
  13445.      CMPI #<data>,<ea>
  13446. CMPMCompare Memory
  13447.      CMPM (Ay)+,(Ax)+
  13448. DBccTest Condition, Decrement, and Branch
  13449.      DBcc Dn,<Iabel>
  13450. DIVSSigned Divide
  13451.      DIVS <ea>,Dn Data
  13452. DIVUUnsigned Divide
  13453.      DIVU <ea>,Dn
  13454. EORExclusive OR Logical
  13455.      EOR Dn,<ea>
  13456.      EORI #<data>,<ea>
  13457. EXGExchange Registers
  13458.      EXG Rx,Ry
  13459. EXTSign Extend
  13460.      EXT Dn Data
  13461. ILLEGALIllegal Instruction
  13462.      ILLEGAL
  13463. impJump
  13464.      JMP <ea>
  13465. JSRJump to Subroutine
  13466.      JSR <ea>
  13467. LEALoad Effective Address
  13468.      LEA <ea>,An
  13469. LINKLink and Allocate
  13470.      LINK An,#<displacement>
  13471. LSLLogical Shift Left
  13472.      LSL Dx,Dy
  13473.      LSL #<daia>,Dy
  13474.      LSL <ea>
  13475. LSRLogical Shift Right
  13476.      LSP Dx,Dy
  13477.      LSR #<data>,Dy
  13478.      LSR <ea>
  13479. MOVEMove Data from Source to Destination
  13480.      MOVE <ea>,<ea>
  13481.      MOVEA <ea>,An
  13482.      MOVEO #<data>,Dn
  13483. MOVEMMove Multiple Registers
  13484.      MOVEM <register list>,<ea>
  13485.      MOVEM <eg&,<register llst>
  13486. MOVEPMove Paiipheral
  13487.  
  13488.  
  13489.  
  13490.  
  13491.  
  13492.      MOVEP DX' d A@,
  13493.  
  13494.                     7 6 x
  13495.  
  13496.                M VEP       d(A     '
  13497.  
  13498.  
  13499. MULS    Sipgngd    ult    I
  13500.     MULS    ea>    @D
  13501.  
  13502. MULUUnsigned Multiple
  13503.      MULTJ <ea>,Dn
  13504. NBCDNegate Decimal with Extend
  13505.      NBCD <ea>
  13506. NEGNegate
  13507.                NEG <ea>
  13508.           NEGX            Negate with Extend
  13509.  
  13510. Page 251
  13511.  
  13512.  
  13513.      NEGX <ea>
  13514. NOPNo Operation
  13515.      NOP
  13516. NOTLogical Complement
  13517.      NOT <ea>
  13518. OR lnclusive OR Logical
  13519.      OR <ea>, Dn
  13520.      OR Dn,<ea>
  13521.      ORI #<data>,<ea>
  13522. PEAPush Effective Address
  13523.      PEA <ea>
  13524. RESETReset External Device
  13525.      RESET
  13526. ROLRotate Left (without Extend)
  13527.      ROL Dx,Dy
  13528.      ROL #<data>,Dn
  13529.      ROL <ea>
  13530. RORRotate Right (without Extend)
  13531.      ROR Dx,Dy
  13532.      ROR #<data>, Dn
  13533.      ROR <ea>
  13534. ROXLRotate Left with Extend
  13535.      ROXL Dx,Dy
  13536.      ROXL #<data>,Dn
  13537.      ROXL <ea>
  13538. ROXRRotate Right with Extend
  13539.      ROXR Dx,Dy
  13540.      ROXR #<data>, Dn
  13541.      ROXR <ea>
  13542. RTEReturn from Exception
  13543.      RTE Data
  13544. RTRReturn and Restore Condition Codes
  13545.      RTR
  13546. RTSReturn from Subroutine
  13547.      RTS
  13548. SBCDSubtract Decimal with Extend
  13549.      SBCD Dy,Dx
  13550.      SBCD -(Ay),-(Ax)
  13551. SccSet according to Condition
  13552.      Scc <ea>
  13553. STOPLoad Status Register and Stop
  13554.      STOP #xxx
  13555. SUBSubtract Binary
  13556.      SUB <ea>,Dn
  13557.      SUB Dn,<ea>
  13558.      SUBA <ea>,An
  13559.      SUBI #<data>,<ea>
  13560.      SUBQ #<data>,<ea>
  13561. SUBXSubtract with Extend
  13562.      SUBX Dy,Dx
  13563.      SUBX -(Ay),-(Ax)
  13564. SWAPSwap Register Halves
  13565.      SWAP Dn
  13566. TASTest & Set an Operand
  13567.      TAS <ea>
  13568. TRAPTrap
  13569.      TRAP #<vector>
  13570. TRAPVTrap an Overflow
  13571.      TRAPV
  13572. TSTTest an Operand
  13573.      TST <ea>
  13574. UNLKUnlink
  13575.      UNLK An Data
  13576.  
  13577.  
  13578. Page 252
  13579.  
  13580. COMMAND INDEX
  13581.  
  13582. ACos            115        Borders            193        Cvi            117        Enable            194
  13583. AGABlue            165        Box            146        Cvl            117        End            100
  13584. AGAGreen        165        Boxf            146        Cvq            117        End            123
  13585. AGAPalRGB        165        Buffer            156        Cycle            166        End            95
  13586. AGARGB            165        ButtonGroup        189        CyclePalette        164        End            97
  13587. AGARed            165        Buttonid        193        End Function        99
  13588. ALibJsr            126        DCB            125        End Setint        100
  13589. AMIGA            121        CELSE            122        DEFTYPE            101        End Statement        98
  13590. ASLFileRequest$     202        CEND            122        Data            106        Endlf            96
  13591. ASLFontRequest        202        CERR:            123        Date$            119        Eof            110
  13592. ASLPathRequest$        202        CNIF            122        DateFormat        119        EraseMode        154
  13593. ASLScreenRequest    202        CSIF            122        Days            119        ErrFail            100
  13594. ASin            115        Call            127        DecodelLBM        145        Event            180
  13595. ASyncFade        166        Case            96        DecodeMedModule        172        EventCode        187
  13596. ATan            115        CaseSense        118        DecodePalette        164        EventQualifier        187
  13597. Abs            113        CatchDosErrs        111        DecodeShapes        152        EventWindow        180
  13598. Activate        184        Centre$            118        DecodeSound        170        Exchange        101
  13599. ActivateString        191        Chr$            116        Default            97        ExecVersion        120
  13600. AddFirst        102        Circle            146        DefaultlDCMP        178        Exists            111
  13601. AddlDCMP        179        Circlef            147        Defaultinput        107        Exp            115
  13602. Addltem            103        ClearList        102        DefaultOutput        107
  13603. AddLast            102        ClearRexxMsg        204        DeleteArgString        206        Fadeln            166
  13604. Addr            123        ClearString        191        DeleteMsgPort        203        FadeOut            166
  13605. AllocMem        128        ClickButton        211        DeleteRexxMsg        204        FadePalette        164
  13606. Asc            116        ClipBlit        158        Dim            102        FadeStatus        166
  13607. AsmExit            126        ClipBlitMode        158        Disable            194        False            113
  13608. AttachGTList        200        CloseEd            129        DiskBuffer        170        Fields            109
  13609. AutoCookie        150        CloseFile        109        DiskPlay        170        Filelnput        110
  13610. CloseScreen        174        DispHeight        113        FileOutput        110    
  13611. BBlit            156        CloseSerial        214        Display            134        FileRequest$        107
  13612. BBlitMode        156        CloseWindow        186        DisplayAdjust        137        FileSeek        110
  13613. BLITZ            121        ClrErr            100        DisplayBitMap        136        FillRexxMsg        204
  13614. BLibJsr            126        Clrlnt            100        DisplayControls        137        Filter            170
  13615. Bank            128        Cls            146        DisplayDblScan        138        FindScreen        173
  13616. BankSize        128        CludgeBitMap        145        DisplayPalette        136        Firstitem        103
  13617. BeepScreen        174        ColSplit        133        DisplayRGB        138        FloatMode        106
  13618. Bin$            116        Colour            142        DisplayRainbow        138        FloodFill        147
  13619. BitMap            144        CookieMode        154        DisplayScroll        139        FlushBuffer        156
  13620. BitMapinput        143        CopLen            134        DisplaySprite        136        FlushEvents        180
  13621. BitMapOrigin        145        CopLoc            134        DisplayUser        139        FlushQueue        155
  13622. BitMapOutput        142        CopyBitMap        144        DoColl            161        For            97
  13623. BitMapWindow        145        CopyShape        150        DoFade            166        Forever            98
  13624. BitMaptoWindow        187        Cos            114        DosBuffLen        111        Format            105
  13625. BitPlanesBitMap        145        CreateArgString        206        DuplicatePalette    167        Frac            113
  13626. Blit            153        CreateDisplay        136        Frames            148
  13627. BlitColl        157        CreateMsgPort        203        EMouseX            184        Free            123
  13628. BlitMode        153        CreateRexxMsg        203        EMouseY            185        Free BitMap        144
  13629. BlitzKeys        140        CursX            142        EVEN            125        Free BlitzFont        142
  13630. BlitzQualifier        140        CursY            143        Edit            107        Free Module        170
  13631. BlitzRepeat        140        Cursor            182        Edit$            106        Free Palette        163
  13632. Block            157        CustomColors        138        EditExit        183        Free Window        177
  13633. BlockScroll        158        CustomCop        133        EditFrom        183        FreeBank        128
  13634. Blue            165        CustomSprites        138        Editat            182        FreeFill        147
  13635. BorderPens        193        CustomString        138        Else            96        FreeMacroKey        213
  13636. FreeMem            128        HTan            115        LoadPalette        163        OpenSerial        214
  13637. FreeSlices        133        Handle            150        LoadScreen        174    
  13638. FromCLI            130        Hex$            116        LoadShape        149        PColl            162
  13639. Function        99        HideScreen        174        LoadShapes        149        PalRGB            164
  13640. Function Return        99        Hours            119        LoadSound        168        PaleneRange        167
  13641. LoadSprites        160        Par$            129        
  13642. GTBevelBox        200        ILBMDepth        112        LoadTape        212        ParPath$        130
  13643. GTButton        198        ILBMHeight        112        Loc            111        Peek            113
  13644. GTChangeList        201        ILBMlnfo        112        Locate            142        Peek            127
  13645. GTCheckBox        198        ILBMViewMode        112        Lof            110        PeekSound        169
  13646. GTCycle            198        ILBMWidth        112        Log            115        Peeks$            127
  13647. GTDisable        201        INCBIN            122        Log10            115        PhoneticSpeak        172
  13648. GTEnable        201        INCDIR            122        LoopSound        169        PlayBack        212
  13649. GTGadPtr        200        INCLUDE            121        PlayMed            171
  13650. GTGetAttrs        201        If            96        MButtons        181        PlayModule        170
  13651. GTGetinteger        201        InFront            160        Macro            123        PlayWait        212
  13652. GTGetString        201        InFrontB        160        MacroKey        213        Plot            146
  13653. GTlnteger        199        InFrontF        160        MakeCookie        150        Point            146
  13654. GTListView        199        InitAnim        148        MaxLen            101        Pointer            140
  13655. GTMX            199        InitBank        128        Maximum            123        Poke            127
  13656. GTNumber        199        InitCopList        135        MenuChecked        197        Poly            147
  13657. GTPalette        199        InitPalette        164        MenuColour        197        Polyf            147
  13658. GTScroller        199        InitShape        152        MenuGap            196        PøP            98
  13659. GTSetAttrs        201        InitSound        169        MenuHit            180        Popinput        107
  13660. GTSetinteger        201        Inkey$            107        Menultem        195        Popitem            103
  13661. GTSetString        201        InnerCls        182        MenuState        197        PopOutput        107
  13662. GTShape            199        InnerHeight        185        MenuTitle        195        PositionSuperBitMap    186
  13663. GTSlider        199        InnerWidth        185        Menus            184        Previtem        103
  13664. GTStatus        201        Instr            116        Mid$            116        Print            105
  13665. GTString        199        Int            114        MidHandle        151        Processor        120
  13666. GTTags            200        InvMode            154        Mins            119        PropGadget        191
  13667. GTText            199        IsRexxMsg        210        Mki$            116        Pushitem        103
  13668. GTToggle        201        ItemHit            180        Mkl$            117        Put            110
  13669. GadgetBorder        193        ItemStackSize        104        Mkq$            117        PutReg            125
  13670. GadgetHit        180        Months            119        PutSuperBitMap        186    
  13671. GadgetJam        190        Joyb            108        Mouse            140    
  13672. GadgetPens        190        Joyr            108        MouseArea        141        QAMIGA            121
  13673. GadgetStatus        193        Joyx            107        MouseButton        211        QAbs            114
  13674. GameB            108        JoYY            108        MouseWait        98        QAngle            115
  13675. Get            110        JumpMed            171        MouseX            141        QBlit            155
  13676. GetMedinstr        172        MouseXSpeed        141        QBlitMode        155            
  13677. GetMedNote        171        KillFile        111        MouseY            141        QFrac            114
  13678. GetMedVolume        171        Kililtem        103        MouseYSpeed        141        QLimit            114
  13679. GetReg            125        MoveScreen        175        QWrap            114    
  13680. GetResultString        210        LCase$            118        Qualifier        181    
  13681. GetRexxComrnand        209        LSet$            117        NEWTYPE            102        Queue            154
  13682. GetRexxResult()        209        Lastitem        103        NPrint            105        QuickPlay        212
  13683. GetSuperBitMap        186        Left$            115        NTSC            113        QuietTrap        213
  13684. GetaShape        150        Len            117        NewPaletteMode        163    
  13685. GetaSprite        159        Let            101        Next            97        RGB Colour        164
  13686. Gosub            95        Line            146        NextFrame        148        RSet$            118
  13687. Goto            95        LoadAnim        148        Nextitem        103        RastPort        186
  13688. Green            164        LoadBank        128        NoCli            129        RawKey            181
  13689. LoadBitMap        145        NumDays            119        RawStatus        140    
  13690.         
  13691. HCos            115        LoadBlikFont        141        NumPars            129        ReMap            147
  13692. HPropBody        192        LoadFont        187        Read            106    
  13693. HPropPot        192        LoadMedModule        171        On            95        ReadFile        109
  13694. HSin            11.s    LoadModule            170        OpenFile        109        ReadMem            111
  13695. ReadSerial        214        SetMenu            196        Subitem            196        WMove            184
  13696. ReadSerialMem        215        SetPeriod        170        SubitemOff        196        WPlot            181
  13697. ReadSerialString    214        SetSerialBuffer        214        SysJsr            126        WPointer        184
  13698. Record            212        SetSerialLens        215        SystemDate        119        WPrintScroll        186
  13699. RectsHit        162        SetSerialParams        215        WScroll            182    
  13700. Red            164        SetString        191        Tan            114        WSize            184
  13701. Redraw            192        SetVProp        192        TapeTrap        213        WTitle            186
  13702. RelMouse        210        SetVoice        172        TextGadget        189        WTopOff            186
  13703. Repeat            97        Sgn            114        Toggle            194        Wait            210
  13704. Replace$        116        ShapeGadget        190        TokeJsr            126        WaitEvent        179
  13705. ReplyRexxMsg        209        ShapeHeight        150        Translate$        172        WbToScreen        173
  13706. ResetList        102        Shapeltem        196        True            113        WeekDay            119
  13707. ResetString        191        ShapeSpriteHit        162        Type            211        Wend            96
  13708. Restore            106        ShapeSub        196         While            96    
  13709. Return            95        ShapeWidth        150        UCase$            118        Window            176
  13710. RexxError()        210        ShapesBitMap        145        USED            123        WindowFont        183
  13711. RexxEvent        210        ShapesHit        162        USEPATH            121        WindowHeight        185
  13712. Right$            115        Shared            99        UStr$            118        Windowloput        178
  13713. Rnd            114        Show            133        UnBuffer        156        WindowOutput        178
  13714. Rotate            151        ShowB            133        UnLeft$            117        WindowTags        187
  13715. Runerrsoff        123        ShowBitMap        175        UnQueue            155        WindowWidth        185
  13716. Runerrson        123        ShowBlitz        134        UnRight$        117        WindowX            185
  13717. ShowF            133        Until            97        WindowY            185    
  13718. SBlit            157        ShowPalette        163        Use            123        WriteFile        109
  13719. SBlitMode        157        ShowScreen        173        Use BitMap        144        WriteMem        111
  13720. SColl            162        ShowSprite        159        Use BlitzFont        142        WriteSerial        214
  13721. SMouseX            174        ShowStencil        157        Use Palette        163        WriteSerialMem        215
  13722. SMouseY            174        Sin            114        Use Slice        132        WriteSerialString    214
  13723. SaveBank        128        SizeLimits        186        Use Window        177    
  13724. SaveBitmap        145        SizeOf            102        XFlip            151    
  13725. SavePalette        164        Slice            131        VPos            113        XINCLUDE        122
  13726. SaveScreen        174        SolidMode        154        VPropBody        192        XStatus            212
  13727. SaveShape        149        Sort            104        VPropPot        192        YFlip            151
  13728. SaveShapes        149        SortDown        104        VWait            98    
  13729. SaveSprites        160        SortList        104        Val            118        Years            119
  13730. SaveTape        212        SortUp            104        ViewPort        174    
  13731. Scale            151        Sound            168        VoiceLoc        172    
  13732. Screen            173        SoundData        169        Volume            169    
  13733. ScreenPens        174        Speak            172        
  13734. ScreenTags        175        SpriteMode        160        WBDepth            120
  13735. ScreensBitMap        144        SpritesHit        162        WBHeight        120
  13736. Scroll            147        Sqr            115        WBStartup        129
  13737. Secs            119        StartMedModule        171        WBViewMode        120
  13738. Select            96        Statement        98        WBWidth            120
  13739. SelectMode        190        Statement        98        WBlit            187
  13740. SendRexxCommand     206        Stencil            157        WBox            181
  13741. SerialEvent        215        Stop            96        WCircle            181
  13742. SetBPLCON0        134        StopCycle        166        WCls            182
  13743. SetColl            161        StopMed            171        WColour            183
  13744. SetCollHi        161        StopModule        170        WCursX            185
  13745. SetCollOdd        161        Str$            118        WCursY            185
  13746. SetCycle        165        String$            116        WEllipse        182
  13747. SetErr            100        StringGadget        190        WJam            183
  13748. SetGadgetStatus        189        StringText$        190        WLeftOff        186
  13749. SetHProp        192        StripLead$        117        WLine            182
  13750. Setlnt            99        StripTrail$        117        WLocate            185
  13751. SetMedMask        172        SubHit             180        WMouseX            184
  13752. SetMedVolume        171        SubiDCIP        179        WMouseY            184
  13753.  
  13754. Copyright
  13755.  
  13756. Copyright  1994  by  Acid Software,  a division of Armstrong  Communications
  13757. Limited,   New Zealand.  This document may not,  in whole or  in  part,   be
  13758. copied,  photocopied,  reproduced,  translaled, or reduced to any electronic
  13759. medium without prior consent, in writing, from Acid Software.
  13760.  
  13761. The  distribution and sale of this product are intended for the use  of  the
  13762. original  purchaser only.  Lawful users of this program are hereby  licensed
  13763. only  to read the program and its libraries from its medium into the  memory
  13764. of the computer solely for the purpose of executing the program.
  13765.  
  13766. Duplicating.  copying,  selling or otherwise distributing this product is  a
  13767. violation of the law.
  13768.  
  13769. Note:   Acid  Software  claim no intellectual or any  other  copyright  over
  13770. software developed in Blitz2 hy registered Blitz2 users.
  13771.  
  13772. Disclaimer
  13773.  
  13774. Acid  Sottware  accept no responsibility for the performance  of  Blitz2  or
  13775. software  developed with Blitz2.  However.  we wili endeavour to  solve  any
  13776. problems  registered users have with the product and  hope  to  support  the
  13777. product to the best of our ability.
  13778.  
  13779. Credits
  13780.  
  13781. Developed  hy  Mark  Sihly using HiSoft's Devpac2.  Printed  in  the  United
  13782. Kinydom  by  Guildhall Leisure Services ,Manual produced with  SoJt  Logik's
  13783. PageStream2 & PageLiner.
  13784.  
  13785. Technical Support
  13786.  
  13787. Users  are  not  entitled  to  any  support unless  reyistration  cards  are
  13788. re(urned.   Support  is  available  via email  from  aCid@iCon.Co.nz.   Acid
  13789. Software  can  also be contacted via fax in New Zealand on  +649  35X  165X.
  13790. Alternatively  mail  any  questions to  the  address  that  appeard  on  the
  13791. registration card enclosed in this pack.lge.
  13792.  
  13793. Upgrades
  13794.  
  13795. Blitz  BASIC  lor  lhe  Amica is continually heing  improved.   Updates  are
  13796. provided free by subscrihing to thc Blitz User Magazine (BUM),  details  are
  13797. included  on the registration card.  Sio:nificant additions to the  language
  13798. are  planned  for 1995 including Atari Jaguar support,  3D graphics  support
  13799. for troth Amiga and Jaguar. as well as a powerful new editor.
  13800.  
  13801. -- THE END --